示例#1
0
        private bool HandleInternalMessage(Peer toPassTo, LidgrenTransferPacket packet)
        {
            if (packet.isEncrypted)
            {
                if (toPassTo.EncryptionRegister.HasKey(packet.EncryptionMethodByte))
                {
                    if (!packet.Decrypt(toPassTo.EncryptionRegister[packet.EncryptionMethodByte]))
                    {
                        ClassLogger.LogError("Failed to decrypt package from Peer ID: "
                                             + toPassTo.UniqueConnectionId + " with EncryptionByte: " + packet.EncryptionMethodByte);
                        return(false);
                    }
                }
            }

            PacketBase deserializedPacketBase = InternalPacketConstructor(packet);

            switch (packet.OperationType)
            {
            case Packet.OperationType.Request:
                return(this.ProcessInternalRequest((InternalPacketCode)packet.PacketCode, deserializedPacketBase, toPassTo));

            case Packet.OperationType.Response:
                return(this.ProcessInternalResponse((InternalPacketCode)packet.PacketCode, deserializedPacketBase, toPassTo));

            case Packet.OperationType.Event:
                throw new LoggableException("GladNet currently does not support internal events.", null, LogType.Error);

            default:
                return(false);
            }
        }
示例#2
0
        //This does not need to be in a unity peer. A Unity peer cannot broadcast.
#if !UNITYDEBUG && !UNITYRELEASE
        //TODO: One day we will need to optimize the ability to broadcast messages as we'll have to convert to a NetConnection list at some point when it's being called externally through
        //the exposed API of GladNet.
        protected void BroadcastEvent(IList <Peer> connections, PacketBase packet, byte packetCode, Packet.DeliveryMethod deliveryMethod, byte encrypt = EncryptionBase.NoEncryptionByte, int channel = 0)
        {
            try
            {
                LidgrenTransferPacket transferPacket = new LidgrenTransferPacket(Packet.OperationType.Event, packet.SerializerKey, packetCode, packet.Serialize());

                if (encrypt != EncryptionBase.NoEncryptionByte)
                {
                    EncryptionLidgrenPackage(encrypt, transferPacket);
                }

                //TODO: Encryption because it's ready
                byte[] bytes = Serializer <GladNetProtobufNetSerializer> .Instance.Serialize(transferPacket);


                //Inefficient O(n) casting to a NetConnection list. Not good.
                this.InternalNetConnection.Peer.SendMessage(false, connections.Select(x => x.InternalNetConnection).ToList(), bytes, Packet.LidgrenDeliveryMethodConvert(deliveryMethod), channel);
            }
            catch (LoggableException e)
            {
                throw;
            }
            catch (Exception e)
            {
                throw new LoggableException("Exception occured in serialization of packet.", e, LogType.Error);
            }
        }
示例#3
0
        public virtual Packet.SendResult SendMessage(Packet.OperationType type, PacketBase packet, byte packetCode, Packet.DeliveryMethod deliveryMethod, int channel = 0, byte encrypt = EncryptionBase.NoEncryptionByte, bool isInternal = false)
#endif
        {
            try
            {
                LidgrenTransferPacket transferPacket = new LidgrenTransferPacket(type, packet.SerializerKey, packetCode, packet.Serialize());

                if (encrypt != EncryptionBase.NoEncryptionByte)
                {
                    EncryptionLidgrenPackage(encrypt, transferPacket);
                }

                //TODO: encryption because it's ready
                byte[] bytes = Serializer <GladNetProtobufNetSerializer> .Instance.Serialize(transferPacket);

                return((Packet.SendResult) this.InternalNetConnection.SendMessage(isInternal, bytes, Packet.LidgrenDeliveryMethodConvert(deliveryMethod), channel));
            }
            catch (LoggableException e)
            {
                throw;
            }
            catch (Exception e)
            {
                throw new LoggableException("Exception occured in serialization of packet.", e, LogType.Error);
            }
        }
示例#4
0
        public MessageInfo(LidgrenTransferPacket lidgrenPacket, NetDeliveryMethod delivery)
#endif
        {
            if (lidgrenPacket == null)
            {
                throw new ArgumentException("In Ctor of MessageInfo a null packet was passed.");
            }
            deliveryMethod            = delivery;
            this.EncryptionMethodType = lidgrenPacket.EncryptionMethodByte;
            this.wasEncrypted         = lidgrenPacket.wasEncrypted;
        }
示例#5
0
 private void EncryptionLidgrenPackage(byte encrypt, LidgrenTransferPacket packet)
 {
     if (EncryptionRegister.HasKey(encrypt))
     {
         packet.Encrypt(EncryptionRegister[encrypt]);
     }
     else
     {
         throw new LoggableException("Failed to encrypt package for Peer ID: "
                                     + this.UniqueConnectionId + " With encryption ByteType: " + encrypt, null, LogType.Error);
     }
 }
示例#6
0
        public virtual bool DispatchMessage(Peer toPassTo, NetIncomingMessage msg, bool isInternal)
        {
            if (msg == null)
            {
                throw new LoggableException("When dispatched NetBuffer was found to be null.", null, LogType.Error);
            }

            LidgrenTransferPacket packet = this.BuildTransferPacket(msg);

            if (toPassTo == null)
            {
                return(false);
            }

            if (!this.SerializerRegister.HasKey(packet.SerializerKey))
            {
                ClassLogger.LogError("Recieved a packet that cannot be handled due to not having a serializer registered with byte code: " + packet.SerializerKey);
                return(false);
            }

            if (packet == null)
            {
                ClassLogger.LogError("Lidgren packet built to null.");
                return(false);
            }

            if (toPassTo == null)
            {
                ClassLogger.LogError("When attempted to dispatch the Peer passed was found to be null.");
                return(false);
            }

#if UNITYDEBUG || DEBUG
            this.ClassLogger.LogDebug("About to handle packet. Encrypted: " + packet.isEncrypted.ToString() + " EncryptionCode: " + packet.EncryptionMethodByte);
#endif

            if (!isInternal)
            {
                if (packet.isEncrypted)
                {
                    return(DispatchEncryptedMessage(toPassTo, packet, msg.DeliveryMethod));
                }
                else
                {
                    return(Dispatch(toPassTo, packet, msg.DeliveryMethod));
                }
            }
            else
            {
                return(HandleInternalMessage(toPassTo, packet));
            }
        }
示例#7
0
        private bool DispatchEncryptedMessage(Peer toPassTo, LidgrenTransferPacket packet, NetDeliveryMethod method)
        {
            if (!toPassTo.EncryptionRegister.HasKey(packet.EncryptionMethodByte))
            {
                ClassLogger.LogError("Failed to decrypt packet. Client requested unregistered method: " + packet.EncryptionMethodByte);
                return(false);
            }

            try
            {
                switch (packet.OperationType)
                {
                case Packet.OperationType.Event:
                    EventPackage ep = this.GeneratePackage <EventPackage>(packet, toPassTo.EncryptionRegister[packet.EncryptionMethodByte]);
                    if (ep != null)
                    {
                        toPassTo.PackageRecieve(ep, new MessageInfo(packet, method));
                    }
                    return(true);

                case Packet.OperationType.Request:
                    RequestPackage rqp = this.GeneratePackage <RequestPackage>(packet, toPassTo.EncryptionRegister[packet.EncryptionMethodByte]);
                    if (rqp != null)
                    {
                        toPassTo.PackageRecieve(rqp, new MessageInfo(packet, method));
                    }
                    return(true);

                case Packet.OperationType.Response:
                    ResponsePackage rp = this.GeneratePackage <ResponsePackage>(packet, toPassTo.EncryptionRegister[packet.EncryptionMethodByte]);
                    if (rp != null)
                    {
                        toPassTo.PackageRecieve(rp, new MessageInfo(packet, method));
                    }
                    return(true);

                default:
                    return(false);
                }
            }
            catch (LoggableException e)
            {
                ClassLogger.LogError(e.Message + e.InnerException != null ? " Inner: " + e.InnerException : "");
                return(false);
            }
        }
示例#8
0
 internal MessageInfo(LidgrenTransferPacket lidgrenPacket, NetDeliveryMethod delivery)