private async Task Process() { try { int frameLength; byte[] payload; int payloadOffset; int payloadCount; while (State == TcpSocketConnectionState.Connected) { int receiveCount = await _stream.ReadAsync(_receiveBuffer, _receiveBufferOffset, _receiveBuffer.Length - _receiveBufferOffset); if (receiveCount == 0) { break; } BufferDeflector.ReplaceBuffer(_bufferManager, ref _receiveBuffer, ref _receiveBufferOffset, receiveCount); while (true) { if (_configuration.FrameBuilder.TryDecodeFrame(_receiveBuffer, _receiveBufferOffset, out frameLength, out payload, out payloadOffset, out payloadCount)) { try { await _dispatcher.OnServerDataReceived(this, payload, payloadOffset, payloadCount); } catch (Exception ex) { HandleUserSideError(ex); } finally { try { BufferDeflector.ShiftBuffer(_bufferManager, frameLength, ref _receiveBuffer, ref _receiveBufferOffset); } catch (ArgumentOutOfRangeException) { } } } else { break; } } } } catch (Exception ex) when(!ShouldThrow(ex)) { } finally { await Close(); } }
private async Task Process() { try { int frameLength; byte[] payload; int payloadOffset; int payloadCount; while (State == TcpSocketConnectionState.Connected) { int receiveCount = await _stream.ReadAsync(_receiveBuffer, 0, _receiveBuffer.Length); if (receiveCount == 0) { break; } BufferDeflector.AppendBuffer(_bufferManager, ref _receiveBuffer, receiveCount, ref _sessionBuffer, ref _sessionBufferCount); while (true) { if (_configuration.FrameBuilder.TryDecodeFrame(_sessionBuffer, _sessionBufferCount, out frameLength, out payload, out payloadOffset, out payloadCount)) { try { await _dispatcher.OnServerDataReceived(this, payload, payloadOffset, payloadCount); } catch (Exception ex) { HandleUserSideError(ex); } finally { BufferDeflector.ShiftBuffer(_bufferManager, frameLength, ref _sessionBuffer, ref _sessionBufferCount); #if DEBUG _log.DebugFormat("Session [{0}] buffer length [{1}].", this, _sessionBufferCount); #endif } } else { break; } } } } catch (Exception ex) when(!ShouldThrow(ex)) { } finally { await Close(); } }
private async Task Process() { try { int frameLength; byte[] payload; int payloadOffset; int payloadCount; int consumedLength = 0; while (State == TcpSocketConnectionState.Connected) { int receiveCount = await _stream.ReadAsync( _receiveBuffer.Array, _receiveBuffer.Offset + _receiveBufferOffset, _receiveBuffer.Count - _receiveBufferOffset); if (receiveCount == 0) { break; } SegmentBufferDeflector.ReplaceBuffer(_configuration.BufferManager, ref _receiveBuffer, ref _receiveBufferOffset, receiveCount); consumedLength = 0; while (true) { frameLength = 0; payload = null; payloadOffset = 0; payloadCount = 0; if (_configuration.FrameBuilder.Decoder.TryDecodeFrame( _receiveBuffer.Array, _receiveBuffer.Offset + consumedLength, _receiveBufferOffset - consumedLength, out frameLength, out payload, out payloadOffset, out payloadCount)) { try { await _dispatcher.OnServerDataReceived(this, payload, payloadOffset, payloadCount); } catch (Exception ex) // catch all exceptions from out-side { await HandleUserSideError(ex); } finally { consumedLength += frameLength; } } else { break; } } if (_receiveBuffer != null && _receiveBuffer.Array != null) { SegmentBufferDeflector.ShiftBuffer(_configuration.BufferManager, consumedLength, ref _receiveBuffer, ref _receiveBufferOffset); } } } catch (ObjectDisposedException) { // looking forward to a graceful quit from the ReadAsync but the inside EndRead will raise the ObjectDisposedException, // so a gracefully close for the socket should be a Shutdown, but we cannot avoid the Close triggers this happen. } catch (Exception ex) { await HandleReceiveOperationException(ex); } finally { await Close(true); // read async buffer returned, remote notifies closed } }
private async Task Process() { try { int frameLength; byte[] payload; int payloadOffset; int payloadCount; int consumedLength = 0; while (State == TcpSocketConnectionState.Connected) { int receiveCount = await _stream.ReadAsync( _receiveBuffer.Array, _receiveBuffer.Offset + _receiveBufferOffset, _receiveBuffer.Count - _receiveBufferOffset); if (receiveCount == 0) { break; } SegmentBufferDeflector.ReplaceBuffer(_configuration.BufferManager, ref _receiveBuffer, ref _receiveBufferOffset, receiveCount); consumedLength = 0; while (true) { frameLength = 0; payload = null; payloadOffset = 0; payloadCount = 0; if (_configuration.FrameBuilder.Decoder.TryDecodeFrame( _receiveBuffer.Array, _receiveBuffer.Offset + consumedLength, _receiveBufferOffset - consumedLength, out frameLength, out payload, out payloadOffset, out payloadCount)) { try { await _dispatcher.OnServerDataReceived(this, payload, payloadOffset, payloadCount); } catch (Exception ex) { await HandleUserSideError(ex); } finally { consumedLength += frameLength; } } else { break; } } SegmentBufferDeflector.ShiftBuffer(_configuration.BufferManager, consumedLength, ref _receiveBuffer, ref _receiveBufferOffset); } } catch (Exception ex) { await HandleReceiveOperationException(ex); } finally { await Close(); } }