public override Task CloseOutputAsync(GameSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken) { // TODO: Validate state if (State == GameSocketState.Open) { _state = GameSocketState.CloseSent; } else if (State == GameSocketState.CloseReceived) { _state = GameSocketState.Closed; } return(_closeAsync((int)closeStatus, statusDescription, cancellationToken)); }
public async override Task CloseOutputAsync(GameSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken) { ThrowIfDisposed(); ThrowIfOutputClosed(); var message = new Message(closeStatus, statusDescription); await _sendBuffer.SendAsync(message, cancellationToken); if (State == GameSocketState.Open) { _state = GameSocketState.CloseSent; } else if (State == GameSocketState.CloseReceived) { _state = GameSocketState.Closed; Close(); } }
public async override Task CloseAsync(GameSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken) { ThrowIfDisposed(); if (State == GameSocketState.Open || State == GameSocketState.CloseReceived) { // Send a close message. await CloseOutputAsync(closeStatus, statusDescription, cancellationToken); } if (State == GameSocketState.CloseSent) { // Do a receiving drain var data = new byte[1024]; GameSocketReceiveResult result; do { result = await ReceiveAsync(new ArraySegment <byte>(data), cancellationToken); }while (result.MessageType != GameSocketMessageType.Close); } }
public override async Task CloseAsync(GameSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken) { if (State == GameSocketState.Open || State == GameSocketState.CloseReceived) { await CloseOutputAsync(closeStatus, statusDescription, cancellationToken); } var buffer = ArrayPool <byte> .Shared.Rent(_rentedBufferSize); try { while (State == GameSocketState.CloseSent) { // Drain until close received await ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken); } } finally { ArrayPool <byte> .Shared.Return(buffer); } }