示例#1
0
 public AsyncReceiveState(SocketClientReceiveAsyncResult asyncResult, AsyncCallback asyncCallback, byte[] buffer, int offset, int reqLength)
 {
     AsyncResult   = asyncResult;
     AsyncCallback = asyncCallback;
     Buffer        = buffer;
     Offset        = offset;
     ReqLength     = reqLength;
 }
示例#2
0
        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);
        }