Example #1
0
        /// <summary>
        /// 数据接收完成时
        /// </summary>
        private void ProcessReceive(object obj)
        {
            if (_socket == null)
            {
                return;
            }

            SocketAsyncEventArgs e = obj as SocketAsyncEventArgs;

            // check if the remote host closed the connection
            if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
            {
                // 如果数据写穿
                if (_decodeBuffer.IsWriteable(e.BytesTransferred) == false)
                {
                    HandleError(true, "The channel fatal error");
                    return;
                }

                // 拷贝数据
                _decodeBuffer.WriteBytes(e.Buffer, 0, e.BytesTransferred);

                // 数据解码
                _decodeTempList.Clear();
                _packageCoder.Decode(_decodeBuffer, _decodeTempList);
                lock (_receiveQueue)
                {
                    for (int i = 0; i < _decodeTempList.Count; i++)
                    {
                        _receiveQueue.Enqueue(_decodeTempList[i]);
                    }
                }

                // 为接收下一段数据,投递接收请求
                e.SetBuffer(0, _receiveBuffer.Length);
                bool willRaiseEvent = _socket.ReceiveAsync(e);
                if (!willRaiseEvent)
                {
                    ProcessReceive(e);
                }
            }
            else
            {
                HandleError(true, $"ProcessReceive error : {e.SocketError}");
            }
        }
Example #2
0
        /// <summary>
        /// 数据接收完成时
        /// </summary>
        private void ProcessReceive(object obj)
        {
            SocketAsyncEventArgs e = obj as SocketAsyncEventArgs;

            // check if the remote host closed the connection
            if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
            {
                _packageCoder.SetReceiveDataSize(e.BytesTransferred);

                // 如果数据写穿
                if (_packageCoder.GetReceiveBufferWriterIndex() > _packageCoder.GetReceiveBufferCapacity())
                {
                    HandleError(true, "The channel fatal error");
                    return;
                }

                // 数据解码
                _decodeTempList.Clear();
                _packageCoder.Decode(_decodeTempList);
                lock (_receiveQueue)
                {
                    for (int i = 0; i < _decodeTempList.Count; i++)
                    {
                        _receiveQueue.Enqueue(_decodeTempList[i]);
                    }
                }

                // 为接收下一段数据,投递接收请求
                e.SetBuffer(_packageCoder.GetReceiveBufferWriterIndex(), _packageCoder.GetReceiveBufferWriteableBytes());
                bool willRaiseEvent = IOSocket.ReceiveAsync(e);
                if (!willRaiseEvent)
                {
                    ProcessReceive(e);
                }
            }
            else
            {
                HandleError(true, $"ProcessReceive error : {e.SocketError}");
            }
        }