Пример #1
0
        protected void ReadCallback(IAsyncResult ar)
        {
            if (ar.AsyncState == null)
            {
                return;
            }

            ReceivedSocketState _state = (ReceivedSocketState)ar.AsyncState;
            int _bytesRead             = _state.WorkSocket.EndReceive(ar);

            if (_bytesRead > 0)
            {
                _state.BytesReceived += _bytesRead;
                _state.DataReceived   = _state.DataReceived.Concat(_state.Buffer.Take(_bytesRead)).ToArray();
                if (_state.WorkSocket.Available > 0)
                {
                    this.BeginRead(_state.WorkSocket, _state);
                }
                else
                {
                    this.OnSocketReceiveCompleted(this, new SocketReceiveCompletedEventArgs
                    {
                        ReceivedSocketState = _state,
                    });
                }
            }
        }
Пример #2
0
        protected void BeginRead(Socket socket, ReceivedSocketState state)
        {
            if (state == null)
            {
                throw new NullReferenceException("ReceivedSocketState为空");
            }

            socket.BeginReceive(state.Buffer, 0, ReceivedSocketState.BUFFER_SIZE, SocketFlags.None, new AsyncCallback(ReadCallback), state);
        }
Пример #3
0
 protected void BeginRead(Socket socket, ReceivedSocketState state = null)
 {
     if (state == null)
     {
         state            = new ReceivedSocketState();
         state.WorkSocket = socket;
     }
     socket.BeginReceive(state.Buffer, 0, ReceivedSocketState.BUFFER_SIZE, SocketFlags.None, new AsyncCallback(ReadCallback), state);
 }
Пример #4
0
        public byte[] Send(byte[] data)
        {
            byte[] _data = null;
            try
            {
                this.CreateSocket();
                IAsyncResult _sendAr = this.WorkSocket.BeginSend(data, 0, data.Length, SocketFlags.None, null, null);
                if (!_sendAr.AsyncWaitHandle.WaitOne(this.SocketTimeout))
                {
                    throw new TimeoutException(string.Format("发送数据包到{0}超时", this.WorkSocket.RemoteEndPoint.ToString()));
                }

                ManualResetEvent.Reset();
                ReceivedSocketState _state = new ReceivedSocketState
                {
                    WorkSocket = this.WorkSocket,
                };
                this.BeginRead(this.WorkSocket, _state);
                if (ManualResetEvent.WaitOne(this.SocketTimeout))
                {
                    if (_state != null)
                    {
                        _data = _state.DataReceived;
                    }
                }
                else
                {
                    throw new TimeoutException(string.Format("接收来自{0}的数据包超时", this.WorkSocket.RemoteEndPoint.ToString()));
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                if (_data == null)
                {
                    _data = new byte[0];
                }
                this.ReleaseSocket();
            }
            return(_data);
        }