Ejemplo n.º 1
0
        public static async Task<ArraySegment<byte>> ReceiveBinaryAsync(this WebSocket webSocket, CancellationToken cancellationToken = default(CancellationToken))
        {
            bool endOfMessage = false;
            MemoryStream ms = null;
            var buffer = new byte[4096];
            var segment = new ArraySegment<byte>(buffer);
            while (!endOfMessage)
            {
                var result = await webSocket.ReceiveAsync(segment, cancellationToken);
                if (result.MessageType == WebSocketMessageType.Close)
                {
                    await webSocket.CloseAsync(result.CloseStatus.Value, null, cancellationToken);
                    return default(ArraySegment<byte>);
                }
                if (result.MessageType != WebSocketMessageType.Binary)
                {
                    await webSocket.CloseAsync(WebSocketCloseStatus.ProtocolError, "Binary message expected, but received Text message", cancellationToken);
                    throw new InvalidOperationException("Received message is not of type Binary.");
                }
                endOfMessage = result.EndOfMessage;
                if (ms == null && endOfMessage)
                {
                    return new ArraySegment<byte>(buffer, 0, result.Count);
                }
                if (ms == null)
                {
                    ms = new MemoryStream();
                }
                ms.Write(buffer, 0, result.Count);
            }
            var outputSegment = new ArraySegment<byte>();
#if NET451
            outputSegment = new ArraySegment<byte>(ms.GetBuffer(), 0, (int)ms.Length);
#else
            ms.TryGetBuffer(out outputSegment);
#endif
            return outputSegment;
        }
Ejemplo n.º 2
0
 public static async Task ReceiveCloseAsync(this WebSocket webSocket, CancellationToken cancellationToken = default(CancellationToken))
 {
     var buffer = new byte[0];
     var segment = new ArraySegment<byte>(buffer);
     var result = await webSocket.ReceiveAsync(segment, cancellationToken);
     if (result.MessageType == WebSocketMessageType.Close)
     {
         await webSocket.CloseAsync(result.CloseStatus.Value, null, cancellationToken);
     }
     else
     {
         await webSocket.CloseAsync(WebSocketCloseStatus.ProtocolError, "Binary message expected, but received Close message", cancellationToken);
         throw new InvalidOperationException("Received message is not of type Close.");
     }
 }
Ejemplo n.º 3
0
 public static Task SendCloseAsync(this WebSocket webSocket, WebSocketCloseStatus closeStatus, CancellationToken cancellationToken)
 {
     return webSocket.CloseAsync(closeStatus, null, cancellationToken);
 }
Ejemplo n.º 4
0
 public static Task SendCloseAsync(this WebSocket webSocket, WebSocketCloseStatus closeStatus = WebSocketCloseStatus.NormalClosure, string statusDescription = null, CancellationToken cancellationToken = default(CancellationToken))
 {
     return webSocket.CloseAsync(closeStatus, statusDescription, cancellationToken);
 }
 public static void Close(this IWebSocket webSocket)
 {
     webSocket.CloseAsync().Wait();
 }