Пример #1
0
        protected void ProcessPacket(ObjectPacket p)
        {
            if (p == null)
            {
                return;
            }

            OnBeforeProcessPacket();

            var packetType = ObjectPacket.GetPacketType(p.PacketId);

            MethodInfo processMethod;

            if (!PacketMethods.TryGetValue(packetType, out processMethod))
            {
                processMethod             = GetType().GetMethod("Process", new[] { packetType });
                PacketMethods[packetType] = processMethod;
            }

            if (processMethod == null)
            {
                throw new NotImplementedException(string.Format("Not Implemented Exception: Method Process({0}).", packetType));
            }

            _parameterCache[0] = p;

            processMethod.Invoke(this, _parameterCache);

            OnAfterProcessPacket();
        }
Пример #2
0
        protected override void ReadHandler()
        {
            MessageBuffer buffer = GetReadBuffer();

            while (buffer.GetActiveSize() > 0)
            {
                int size = RecvHeaderSize;

                if (buffer.GetActiveSize() < size)
                {
                    break;
                }

                // We just received nice new header
                if (!_NextPacketDecrypted)
                {
                    _authCrypt.DecryptRecv(buffer.Data(), buffer.Rpos(), size);
                }
                _NextPacketDecrypted = false;

                var addr = Marshal.UnsafeAddrOfPinnedArrayElement(buffer.Data(), buffer.Rpos());

                int  packetId;
                bool compressed;

                if (ServerSocket)
                {
                    var header = Marshal.PtrToStructure <ClientPacketHeader>(addr);
                    size       = header.Size + sizeof(ushort);
                    packetId   = header.PacketId;
                    compressed = header.Compressed != 0;
                }
                else
                {
                    var header = Marshal.PtrToStructure <ServerPacketHeader>(addr);
                    size       = header.Size + sizeof(int);
                    packetId   = header.PacketId;
                    compressed = header.Compressed != 0;
                }

                var packetType = ObjectPacket.GetPacketType(packetId);

                if (packetType == null || size <= 0 || size >= _MaxPacketSize)
                {
                    if (LogException)
                    {
                        var message = string.Format("Client {0} sent malformed packet (size: {1}, packetId: {2}).", RemoteAddress, size, packetId);

                        if (NetSettings.Logger != null)
                        {
                            NetSettings.Logger.Warn(message);
                        }
                        else
                        {
                            Console.WriteLine(message);
                        }
                    }

                    if (CloseOnMalformedPacket)
                    {
                        CloseSocket();
                        return;
                    }
                    else
                    {
                        // Buffer are corrupted, reset!
                        buffer.Reset();
                        continue;
                    }
                }

                if (buffer.GetActiveSize() < size)
                {
                    // NOTE: The header buffer of next upcoming packet is already decrypted in above code.
                    // We must skip _authCrypt.DecryptRecv() for next packet.
                    _NextPacketDecrypted = true;
                    break;
                }

                buffer.ReadCompleted(RecvHeaderSize);
                size -= RecvHeaderSize;
                DeserializePacket(packetType, compressed, size, buffer);
            }

            AsyncRead();
        }