public AsyncReceiveState(SocketClientReceiveAsyncResult asyncResult, AsyncCallback asyncCallback, byte[] buffer, int offset, int reqLength) { AsyncResult = asyncResult; AsyncCallback = asyncCallback; Buffer = buffer; Offset = offset; ReqLength = reqLength; }
public override IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, Object state) { var client = _client; Debug.WriteLine("Client ({0}): BeginReceive", InternalRemoteEndPoint); CheckDisposed(); if (buffer == null) { throw new ArgumentNullException("buffer"); } if (offset < 0 || offset > buffer.Length) { throw new ArgumentOutOfRangeException("offset"); } if (size < 0 || size > buffer.Length - offset) { throw new ArgumentOutOfRangeException("size"); } if (_shutdown.HasValue && (_shutdown == SocketShutdown.Receive || _shutdown == SocketShutdown.Both)) { throw new SocketException(SocketError.Shutdown); } var srir = new SocketClientReceiveAsyncResult { AsyncState = state }; if (size == 0) { srir.CompletedSynchronously = true; ((CEvent)srir.AsyncWaitHandle).Set(); srir.IsCompleted = true; srir.errorCode = SocketErrorCodes.SOCKET_OK; if (callback != null) { DoAsyncCallback(callback, srir); } } else { if (dataBuffer.Count == 0) { if (finishing) { srir.CompletedSynchronously = true; srir.IsCompleted = true; ((CEvent)srir.AsyncWaitHandle).Set(); if (callback != null) { DoAsyncCallback(callback, srir); } } else { var result = client.ReceiveDataAsync(AsyncReceiveComplete, new AsyncReceiveState(srir, callback, buffer, offset, size)); if (result != SocketErrorCodes.SOCKET_OK && result != SocketErrorCodes.SOCKET_OPERATION_PENDING) { throw new SocketException(result.ToError()); } } } else { int retLength = dataBuffer.Count <= size ? dataBuffer.Count : size; Debug.WriteLine(string.Format("Client ({1}): SyncReceiveComplete [{0}]", retLength, InternalRemoteEndPoint)); Buffer.BlockCopy(dataBuffer.ToArray(), 0, buffer, offset, retLength); dataBuffer.RemoveRange(0, retLength); srir.dataReceived = retLength; srir.CompletedSynchronously = true; srir.IsCompleted = true; ((CEvent)srir.AsyncWaitHandle).Set(); if (callback != null) { DoAsyncCallback(callback, srir); } } } return(srir); }