Пример #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
 public virtual void SendObjectPacket(ObjectPacket packet, bool encrypt, bool compress = false)
 {
     if (Socket != null)
     {
         Socket.SendObjectPacket(packet, encrypt, compress);
     }
 }
Пример #3
0
        public void SendObjectPacket(ObjectPacket packet, bool encrypt, bool compress = false)
        {
            // Invoke the following generic method here to enable AOT
            //   public static byte[] Serialize<T>(T value, MessagePackSerializerOptions options = null, CancellationToken cancellationToken = default);

            MethodInfo genericSerializeMethod;
            var        packetType = packet.GetType();

            if (!_GenericSerializeMethods.TryGetValue(packetType, out genericSerializeMethod))
            {
                genericSerializeMethod = SerializeMethod.MakeGenericMethod(packetType);
                _GenericSerializeMethods[packetType] = genericSerializeMethod;
            }

            _parameterCache2.Value[0] = packet;
            _parameterCache2.Value[1] = compress ? NetSettings.LZ4CompressOptions : NetSettings.MessagePackOptions;

            var data = genericSerializeMethod.Invoke(null, _parameterCache2.Value) as byte[];

            var size = data.Length + HeaderTailSize;

            var buffer = new MessageBuffer(size + (ServerSocket ? 4 : 2));

            if (ServerSocket)
            {
                buffer.Write(BitConverter.GetBytes((int)size), 4);
            }
            else
            {
                buffer.Write(BitConverter.GetBytes((ushort)size), 2);
            }

            buffer.Write(BitConverter.GetBytes(packet.PacketId), 4);
            buffer.Write(BitConverter.GetBytes(compress), 1);
            buffer.Write(data, data.Length);

            if (encrypt)
            {
                _authCrypt.EncryptSend(buffer.Data(), 0, SendHeaderSize);
            }

            SendPacket(buffer);
        }
Пример #4
0
 public virtual void QueuePacket(ObjectPacket packet)
 {
     _receiveQueue.Enqueue(packet);
 }
Пример #5
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();
        }
Пример #6
0
 /// <summary>
 /// Collect all ObjectPacket classes in assemblies for handling packet serialization and deserialization.
 /// </summary>
 public static void InstallPackets(params Assembly[] packetAssemblies)
 {
     ObjectPacket.Initialize(packetAssemblies);
 }