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));
        }
Exemple #2
0
        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));
            }
        }
Exemple #3
0
        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");
            }
        }