コード例 #1
0
        public void TestBase(
            IPacketFilter filter,
            int dataSize)
        {
            NetDataWriter writer = new NetDataWriter();

            byte[] data = GetData(dataSize);

            foreach (var item in data)
            {
                writer.Write(item);
            }

            NetPacket packet = NetPool.PacketPool.Alloc(PacketProperty.UserData, writer);

            var encodedPacket = filter.Encode(packet);
            var decodedPacket = filter.Decode(encodedPacket);

            NetDataReader reader = new NetDataReader(decodedPacket);

            Assert.GreaterOrEqual(decodedPacket.Size, packet.Size);

            for (int i = 0; i < data.Length; i++)
            {
                Assert.AreEqual(data[i], reader.ReadByte());
            }
        }
コード例 #2
0
ファイル: ChannelBase.cs プロジェクト: christianhood/EuNet
        /// <summary>
        /// 버퍼를 입력하여 패킷 단위로 읽어서 처리합니다.
        /// </summary>
        /// <param name="buffer">읽을 버퍼 (보통 채널을 통해 받은 데이터 버퍼)</param>
        /// <param name="totalReceivedSize">버퍼에서 사용되는 크기</param>
        /// <param name="packetFilter">패킷필터</param>
        /// <returns>처리가 완료된 buffer의 offset. 에러가 난 경우 -1</returns>
        protected int ReadPacket(byte[] buffer, int totalReceivedSize, IPacketFilter packetFilter)
        {
            int offset     = 0;
            int remainSize = totalReceivedSize;

            while (remainSize >= NetPacket.HeaderSize)
            {
                int packetSize = BitConverter.ToUInt16(buffer, offset);

                // 최대 패킷크기를 초과했으니 에러
                if (packetSize >= NetPacket.MaxTcpPacketSize)
                {
                    Close();
                    return(-1);
                }

                // 받은 사이즈가 실제 패킷사이즈보다 작으니 기다리자
                if (remainSize < packetSize)
                {
                    break;
                }

                NetPacket packet = NetPool.PacketPool.Alloc(packetSize);
                Buffer.BlockCopy(buffer, offset, packet.RawData, 0, packetSize);

                // 패킷을 가공하자
                IPacketFilter filter = packetFilter;
                while (filter != null)
                {
                    packet = filter.Decode(packet);
                    filter = filter.NextFilter;
                }

                // 유저 패킷 처리
                OnPacketReceived(packet);

                offset     += packetSize;
                remainSize -= packetSize;

                Interlocked.Increment(ref _statistic.PacketReceivedCount);
            }

            return(offset);
        }