Пример #1
0
        /// <summary>
        /// 连续发送多个字节数组,并自动添加封包头
        /// </summary>
        /// <param name="buffers">任意多个字节数组</param>
        public void SendData(params byte[][] buffers)
        {
            if (!IsAlive)
            {
                return;
            }

            lock (_lock) // TODO:这里用锁是因为调用他的时候可能是多线程调用,碰到了再说
            {
                var offset = 0;

                // 统计发送全部字符数组需要的长度,4是封包头的长度
                var length    = buffers.Sum(buffer => buffer.Length + _encryptor.IvLength);
                var bigBuffer = new byte[length];

                foreach (var buffer in buffers)
                {
                    // 依次将封包头和真正内容填入封包
                    var header = _encryptor.GetPacketHeader(buffer.Length);
                    Buffer.BlockCopy(header, 0, bigBuffer, offset, _encryptor.IvLength);
                    offset += _encryptor.IvLength;
                    _encryptor.Transform(buffer);
                    Buffer.BlockCopy(buffer, 0, bigBuffer, offset, buffer.Length);
                    offset += buffer.Length;
                }

                SendRawData(bigBuffer);
            }
        }
Пример #2
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}");
                }
            }
        }
Пример #3
0
        public void Send(params byte[][] buffers)
        {
            if (!this.IsAlive)
            {
                return;
            }

            lock (mLocker)
            {
                int length = 0;
                int offset = 0;

                foreach (byte[] buffer in buffers)
                {
                    length += 4;
                    length += buffer.Length;
                }

                byte[] final = new byte[length];

                foreach (byte[] buffer in buffers)
                {
                    mSendCipher.GetHeaderToClient(final, offset, buffer.Length);

                    offset += 4;

                    mSendCipher.Transform(buffer);

                    Buffer.BlockCopy(buffer, 0, final, offset, buffer.Length);

                    offset += buffer.Length;
                }

                this.SendRaw(final);
            }
        }
Пример #4
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);
                }
            }
        }