private void TryReceive() { if (!m_Receiving.TryEnter()) { return; } var receiveAsyncEventArgs = new SocketAsyncEventArgs { UserToken = new ReceiveContextData(2 * INITIAL_READ_BYTES) }; receiveAsyncEventArgs.Completed += (sender, e) => OnReceiveCompleted(e); try { receiveAsyncEventArgs.PrepareReceiveBuffer(INITIAL_READ_BYTES); bool willRaiseEventLater; while (!(willRaiseEventLater = ReceiveAsync(receiveAsyncEventArgs))) { var canReceive = CompleteReceive(receiveAsyncEventArgs); if (!canReceive) { break; } } } catch (Exception e) { CloseSocketWhileReceiving(receiveAsyncEventArgs, e); } }
private bool CompleteReceive(SocketAsyncEventArgs args) { if (args.SocketError != SocketError.Success) { CloseSocketWhileReceiving(args, new SocketException((int)args.SocketError)); return(false); } var bytesReceiveRequested = args.Count; if (args.BytesTransferred <= 0 && 0 < bytesReceiveRequested) { CloseSocketWhileReceiving(args); return(false); } var receivedEventData = args.UserToken as ReceiveContextData; receivedEventData.ExpandReceiveBuffer(args.BytesTransferred); var bytesConsumed = m_OnReceived(receivedEventData.ReceiveBuffer); if (bytesConsumed > 0) { receivedEventData.SkipConsumedData(bytesConsumed); } else if (bytesConsumed < 0) { return(false); } int bytesToReceive; if (args.BytesTransferred < bytesReceiveRequested) { bytesToReceive = INITIAL_READ_BYTES; } else { var nextRequestReadBytes = READ_BYTES_INCREASING_RATE * bytesReceiveRequested; if (nextRequestReadBytes < 0) { nextRequestReadBytes = int.MaxValue; } bytesToReceive = nextRequestReadBytes; } args.PrepareReceiveBuffer(bytesToReceive); return(true); }