コード例 #1
0
        internal ServerPacket RecieveSinglePacketIfAvailable(PacketBuffer pBuffer)
        {
            if (pBuffer.Length <= 0)
            {
                return(null);
            }
            ServerPacketId packetid = (ServerPacketId)pBuffer[0];

            ServerPacketInfo info;

            if (!_registry.TryGetValue(packetid, out info))
            {
                InvokeOnUnknownPacket(string.Format("Invalid packet {0}, clearing buffer.", packetid), pBuffer.buffer);
                pBuffer.ClearIncoming();
            }
            else
            {
                ushort packetlen;
                if (!info.isFixedLen)
                {
                    if (pBuffer.Length < 3)
                    {
                        return(null);
                    }
                    packetlen = (ushort)(pBuffer[1] << 8 | pBuffer[2]);
                }
                else
                {
                    packetlen = info.FixedLength;
                }
                if (pBuffer.Length >= packetlen)
                {
                    ServerPacket packet = null;
                    if (info.Factory != null)
                    {
                        packet = info.Factory(new PacketReader(Version, pBuffer, packetlen));
                    }
                    pBuffer.RemoveBufferHead(packetlen);
                    return(packet);
                }
            }
            return(null);
        }
コード例 #2
0
 void ReadStream(NetworkStream stream)
 {
     if (stream.DataAvailable && stream.CanRead)
     {
         try
         {
             Reader.Read(stream);
         }
         catch (System.IO.IOException)
         {
             Disconnect();
         }
         catch (Network.BufferOverflowException ex)
         {
             if (OnReadBufferOverflow != null)
             {
                 OnReadBufferOverflow(ex.Message + ": clearing buffer");
             }
             Reader.ClearIncoming();
         }
     }
 }