internal async Task <GameSocketReceiveTuple> ReceiveAsync(ArraySegment <byte> buffer, CancellationToken cancel) { GameSocketReceiveResult nativeResult = await _gameSocket.ReceiveAsync(buffer, cancel); if (nativeResult.MessageType == GameSocketMessageType.Close) { _environment[OwinConstants.GameSocket.ClientCloseStatus] = (int)(nativeResult.CloseStatus ?? GameSocketCloseStatus.NormalClosure); _environment[OwinConstants.GameSocket.ClientCloseDescription] = nativeResult.CloseStatusDescription ?? string.Empty; } return(new GameSocketReceiveTuple( EnumToOpCode(nativeResult.MessageType), nativeResult.EndOfMessage, nativeResult.Count)); }
public override async Task <GameSocketReceiveResult> ReceiveAsync(ArraySegment <byte> buffer, CancellationToken cancellationToken) { ThrowIfDisposed(); ThrowIfInputClosed(); ValidateSegment(buffer); // TODO: InvalidOperationException if any receives are currently in progress. Message receiveMessage = _receiveMessage; _receiveMessage = null; if (receiveMessage == null) { receiveMessage = await _receiveBuffer.ReceiveAsync(cancellationToken); } if (receiveMessage.MessageType == GameSocketMessageType.Close) { _closeStatus = receiveMessage.CloseStatus; _closeStatusDescription = receiveMessage.CloseStatusDescription ?? string.Empty; var result = new GameSocketReceiveResult(0, GameSocketMessageType.Close, true, _closeStatus, _closeStatusDescription); if (_state == GameSocketState.Open) { _state = GameSocketState.CloseReceived; } else if (_state == GameSocketState.CloseSent) { _state = GameSocketState.Closed; Close(); } return(result); } else { int count = Math.Min(buffer.Count, receiveMessage.Buffer.Count); bool endOfMessage = count == receiveMessage.Buffer.Count; Array.Copy(receiveMessage.Buffer.Array, receiveMessage.Buffer.Offset, buffer.Array, buffer.Offset, count); if (!endOfMessage) { receiveMessage.Buffer = new ArraySegment <byte>(receiveMessage.Buffer.Array, receiveMessage.Buffer.Offset + count, receiveMessage.Buffer.Count - count); _receiveMessage = receiveMessage; } endOfMessage = endOfMessage && receiveMessage.EndOfMessage; return(new GameSocketReceiveResult(count, receiveMessage.MessageType, endOfMessage)); } }
private static async Task RunEchoServer() { HttpListener listener = new HttpListener(); listener.Prefixes.Add("http://localhost:12345/"); listener.Start(); Console.WriteLine("Started"); while (true) { HttpListenerContext context = listener.GetContext(); if (!context.Request.IsGameSocketRequest) { context.Response.Close(); continue; } Console.WriteLine("Accepted"); var wsContext = await context.AcceptGameSocketAsync(null); var gameSocket = wsContext.GameSocket; byte[] buffer = new byte[1024]; GameSocketReceiveResult received = await gameSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); while (received.MessageType != GameSocketMessageType.Close) { Console.WriteLine($"Echoing {received.Count} bytes received in a {received.MessageType} message; Fin={received.EndOfMessage}"); // Echo anything we receive await gameSocket.SendAsync(new ArraySegment <byte>(buffer, 0, received.Count), received.MessageType, received.EndOfMessage, CancellationToken.None); received = await gameSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } await gameSocket.CloseAsync(received.CloseStatus.Value, received.CloseStatusDescription, CancellationToken.None); gameSocket.Dispose(); Console.WriteLine("Finished"); } }