protected virtual async Task ReceiveFromRemotePeerAsync(RemoteTcpPeer remoteTcpPeer, CancellationToken cancellationToken) { Defragmentation.ReadFrameResult readFrameResult = null; while (!cancellationToken.IsCancellationRequested) { using (var timeoutCts = this.Config.ConnectionTimeout == TimeSpan.Zero ? new CancellationTokenSource() : new CancellationTokenSource(this.Config.ConnectionTimeout)) using (var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(timeoutCts.Token, cancellationToken)) { readFrameResult = await remoteTcpPeer.ProtocolFrameDefragmenter .ReadFrameAsync(remoteTcpPeer, readFrameResult?.LeftOvers, linkedCts.Token) .ConfigureAwait(false); } if (readFrameResult.ReadFrameStatus == Defragmentation.ReadFrameStatus.StreamClosed) { remoteTcpPeer.ConnectionCloseReason = ConnectionCloseReason.RemoteShutdown; return; } else if (readFrameResult.ReadFrameStatus == Defragmentation.ReadFrameStatus.FrameDropped) { readFrameResult = null; continue; } var tcpFrameArrivedData = new TcpFrameArrivedData(remoteTcpPeer, readFrameResult.FrameData); var frameArrivedEventArgs = new TcpFrameArrivedEventArgs(tcpFrameArrivedData); this.OnFrameArrived(remoteTcpPeer, frameArrivedEventArgs); } remoteTcpPeer.ConnectionCloseReason = ConnectionCloseReason.LocalShutdown; }
public TcpFrameArrivedEventArgs(TcpFrameArrivedData tcpFrameArrivedData) { this.TcpFrameArrivedData = tcpFrameArrivedData; }