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; }
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."); } }
public static Task SendCloseAsync(this WebSocket webSocket, WebSocketCloseStatus closeStatus, CancellationToken cancellationToken) { return webSocket.CloseAsync(closeStatus, null, cancellationToken); }
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(); }