示例#1
0
        /// <summary>
        /// 持续接收数据
        /// </summary>
        public async void ReceiveData()
        {
            byte[] buffer;

            while (IsAlive)
            {
                if (!_networkStream.DataAvailable)
                {
                    continue;
                }

                try
                {
                    // 读取封包头
                    var length = _encryptor.IvLength;
                    buffer = new byte[length];
                    if (await _networkStream.ReadAsync(buffer, 0, length) == length)
                    {
                        length = MapleCryptograph.GetPacketLength(buffer);
                    }

                    // 通过收取到的封包头计算数据长度,如果比缓冲区还长则停止会话
                    // 如果检测出封包头不满足约束条件,则停止会话
                    if (length > _client.ReceiveBufferSize || !_decryptor.IsValidHeader(buffer))
                    {
                        Dispose();
                        return;
                    }

                    // 读取真正内容
                    buffer = new byte[length];
                    if (await _networkStream.ReadAsync(buffer, 0, length) == length)
                    {
                        _decryptor.Transform(buffer);
                        OnDataReceived(this, new DataReceivedEventArgs {
                            ReceivedData = buffer
                        });
                    }
                }
                catch (Exception e)
                {
                    Debug.WriteLine($"会话:读取数据出错,错误信息 {e.Message}");
                }
            }
        }
示例#2
0
        private async void Receive()
        {
            if (!mNetworkStream.CanRead)
            {
                this.Close();
                return;
            }

            while (IsAlive)
            {
                if (!mNetworkStream.DataAvailable)
                {
                    continue;
                }

                var length = 4;
                mBuffer = new byte[length];
                if (await mNetworkStream.ReadAsync(mBuffer, 0, length) == length)
                {
                    length = MapleCryptograph.GetPacketLength(mBuffer);
                }

                if (length > mSocket.ReceiveBufferSize || !mRecvCipher.CheckServerPacket(mBuffer, 0))
                {
                    this.Close();
                    return;
                }

                mBuffer = new byte[length];
                if (await mNetworkStream.ReadAsync(mBuffer, 0, length) == length)
                {
                    mRecvCipher.Transform(mBuffer);
                    Dispatch(mBuffer);
                }
            }
        }