|
@@ -7,6 +7,8 @@ using System.Net;
|
|
|
using System.Net.WebSockets;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
+using System.Timers;
|
|
|
+using Timer = System.Timers.Timer;
|
|
|
|
|
|
namespace EVCB_OCPP.WSServer.Service.WsService
|
|
|
{
|
|
@@ -60,12 +62,25 @@ namespace EVCB_OCPP.WSServer.Service.WsService
|
|
|
while (!token.IsCancellationRequested)
|
|
|
{
|
|
|
var buffer = new byte[1024 * 4];
|
|
|
- var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), token);
|
|
|
- if (result.CloseStatus.HasValue)
|
|
|
+ WebSocketReceiveResult result = null;
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), token);
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ _ = BruteClose(e.Message);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (result == null || result.CloseStatus.HasValue)
|
|
|
{
|
|
|
- _ = InternalClose(result.CloseStatus.Value);
|
|
|
+ //closed gracefully
|
|
|
+ _ = GracefulClose(result.CloseStatus.Value);
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
received += Encoding.UTF8.GetString(buffer, 0, result.Count);
|
|
|
//m_ReceiveData?.Invoke(this, received);
|
|
|
LastActiveTime = DateTime.UtcNow;
|
|
@@ -82,40 +97,60 @@ namespace EVCB_OCPP.WSServer.Service.WsService
|
|
|
|
|
|
}
|
|
|
|
|
|
- internal void Send(string dataString)
|
|
|
+ internal Task Send(string dataString)
|
|
|
{
|
|
|
var data = Encoding.UTF8.GetBytes(dataString);
|
|
|
- ClientWebSocket.SendAsync(data, WebSocketMessageType.Text, endOfMessage: true, cancellationToken: disconnectCancellationTokenSource.Token);
|
|
|
+ return Send(data, 0 , data.Length);
|
|
|
}
|
|
|
|
|
|
- internal void Send(byte[] data, int offset, int length)
|
|
|
+ internal async Task Send(byte[] data, int offset, int length)
|
|
|
{
|
|
|
- ClientWebSocket.SendAsync(data, WebSocketMessageType.Text, endOfMessage: true, cancellationToken: disconnectCancellationTokenSource.Token);
|
|
|
+ await ClientWebSocket.SendAsync(data, WebSocketMessageType.Text, endOfMessage: true, cancellationToken: disconnectCancellationTokenSource.Token);
|
|
|
+ if (ClientWebSocket.State == WebSocketState.Aborted ||
|
|
|
+ ClientWebSocket.State == WebSocketState.Closed)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
internal Task Close()
|
|
|
{
|
|
|
+ return ServerClose();
|
|
|
+ }
|
|
|
+
|
|
|
+ private Task ServerClose()
|
|
|
+ {
|
|
|
+ SessionClosed?.Invoke(this, "ServerShutdown");
|
|
|
return InternalClose(WebSocketCloseStatus.NormalClosure, "ServerShutdown");
|
|
|
}
|
|
|
|
|
|
- private Task InternalClose(WebSocketCloseStatus closeStatus)
|
|
|
+ private Task GracefulClose(WebSocketCloseStatus closeStatus)
|
|
|
{
|
|
|
+ SessionClosed?.Invoke(this, closeStatus.ToString());
|
|
|
return InternalClose(closeStatus , null);
|
|
|
}
|
|
|
|
|
|
+ private Task BruteClose(string description)
|
|
|
+ {
|
|
|
+ SessionClosed?.Invoke(this, description);
|
|
|
+ return InternalClose(WebSocketCloseStatus.EndpointUnavailable, description);
|
|
|
+ }
|
|
|
+
|
|
|
private async Task InternalClose(WebSocketCloseStatus closeStatus, string description)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
await _WebSocket.CloseAsync(closeStatus, description, default);
|
|
|
}
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ }
|
|
|
finally
|
|
|
{
|
|
|
_WebSocket.Dispose();
|
|
|
}
|
|
|
|
|
|
disconnectCancellationTokenSource.Cancel();
|
|
|
- SessionClosed?.Invoke(this, closeStatus.ToString());
|
|
|
EndConnSemaphore.Release();
|
|
|
}
|
|
|
}
|