Exemplo n.º 1
0
 // Params:
 //    Accept: 0, 0
 //    Disconnect: InternalReason, UserReason
 //    Ping: PingSeq, Loss
 //    Pong: PingSeq, Dropped
 internal static int PackProtocol(byte[] buffer, NetPacketType type, byte firstParam, byte secondParam)
 {
     buffer[0] = (byte)type;
     buffer[1] = firstParam;
     buffer[2] = secondParam;
     return(PROTOCOL_HEADER_SIZE);
 }
Exemplo n.º 2
0
 /// <summary>
 /// Registers the given function delegate to the given packet type.
 /// </summary>
 /// <param name="type">packet type to handle</param>
 /// <param name="handler">function delegate designed to handle it</param>
 public void Unbind(NetPacketType type, MessageDelegate handler)
 {
     if (handlers.ContainsKey(type))
     {
         handlers[type] -= handler;
     }
 }
Exemplo n.º 3
0
        public void TestProtocol()
        {
            byte[] buffer = new byte[100];

            NetPacketType type        = NetPacketType.Kick;
            byte          firstParam  = 0xAF;
            byte          secondParam = 0xFA;
            int           bytesPacked =
                NetEncoding.PackProtocol(
                    buffer,
                    type,
                    firstParam,
                    secondParam);

            byte firstParamRead;
            byte secondParamRead;
            bool success =
                NetEncoding.ReadProtocol(
                    buffer,
                    bytesPacked,
                    out firstParamRead,
                    out secondParamRead);

            Assert.AreEqual(0, buffer[bytesPacked]);
            Assert.AreEqual(NetPacketType.Kick, NetEncoding.GetType(buffer));
            Assert.AreEqual(true, success);
            Assert.AreEqual(firstParam, firstParamRead);
            Assert.AreEqual(secondParam, secondParamRead);
        }
 bool IsPacketConnectionless(NetPacketType type)
 {
     return
         (type == NetPacketType.ConnectionApproved ||
          type == NetPacketType.ConnectionDenied ||
          type == NetPacketType.ConnectionRequest ||
          type == NetPacketType.ConnectionReady ||
          type == NetPacketType.Disconnected);
 }
Exemplo n.º 5
0
        /// <summary>
        /// Polls the socket and receives all pending packet data.
        /// </summary>
        private void ReadPackets()
        {
            for (int i = 0; i < NetConfig.MaxPacketReads; i++)
            {
                IPEndPoint  source;
                byte[]      buffer;
                int         length;
                SocketError result =
                    this.receiver.TryReceive(out source, out buffer, out length);
                if (NetSocket.Succeeded(result) == false)
                {
                    return;
                }

                NetPacketType type = NetEncoding.GetType(buffer);
                if (type == NetPacketType.Connect)
                {
                    // We don't have a peer yet -- special case
                    this.HandleConnectRequest(source, buffer, length);
                }
                else
                {
                    NetPeer peer;
                    if (this.peers.TryGetValue(source, out peer))
                    {
                        switch (type)
                        {
                        case NetPacketType.Accept:
                            this.HandleConnectAccept(peer, buffer, length);
                            break;

                        case NetPacketType.Kick:
                            this.HandleKick(peer, buffer, length);
                            break;

                        case NetPacketType.Ping:
                            this.HandlePing(peer, buffer, length);
                            break;

                        case NetPacketType.Pong:
                            this.HandlePong(peer, buffer, length);
                            break;

                        case NetPacketType.Carrier:
                            this.HandleCarrier(peer, buffer, length);
                            break;

                        case NetPacketType.Payload:
                            this.HandlePayload(peer, buffer, length);
                            break;
                        }
                    }
                }
            }
        }
Exemplo n.º 6
0
 /// <summary>
 /// Registers the given function delegate to the given packet type.
 /// </summary>
 /// <param name="type">packet type to handle</param>
 /// <param name="handler">function delegate designed to handle it</param>
 public void Bind(NetPacketType type, MessageDelegate handler)
 {
     if (handlers.ContainsKey(type))
     {
         handlers[type] += handler;
     }
     else
     {
         handlers.Add(type, handler);
     }
 }
Exemplo n.º 7
0
        public static byte[] MakePacket(NetPacketType type, byte[] bs)
        {
            byte[] ret = new byte[NetPacketHead.HEAD_SIZE + bs.Length];
            Array.Copy(BitConverter.GetBytes(NetPacketHead.Version), 0, ret, 0, sizeof(Int32));
            Array.Copy(BitConverter.GetBytes((Int32)type), 0, ret, sizeof(Int32), sizeof(Int32));
            int Len = bs.Length;

            Array.Copy(BitConverter.GetBytes(Len), 0, ret, sizeof(Int32) * 2, sizeof(Int32));
            Array.Copy(bs, 0, ret, NetPacketHead.HEAD_SIZE, bs.Length);

            return(ret);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Invokes the function handler assigned to the specified packet type, using the EventArgs object as parameter.
        /// </summary>
        /// <param name="type">packet type</param>
        /// <param name="peer">sender client</param>
        /// <param name="args">parameters for the function (raw data etc.)</param>
        protected void HandleEvent(NetPacketType type, NetPeer source, NetEventArgs args)
        {
            MessageDelegate handler;

            if (handlers.TryGetValue(type, out handler))
            {
                handler(source, args);
            }
            else
            {
                if (defaultHandler != null)
                {
                    defaultHandler.Invoke(source, args);
                }
            }
        }
Exemplo n.º 9
0
        protected void WriteRawPacket(BitStream stream, NetPacketType packetType)
        {
            WritePacketHeader(stream, packetType);

            if (packetType == NetPacketType.DataPacket)
            {
                var note = AllocNotify();

                ++NumNotifies;

                if (NotifyQueueHead == null)
                {
                    NotifyQueueHead = note;
                }
                else
                {
                    NotifyQueueTail.NextPacket = note;
                }

                NotifyQueueTail = note;

                note.NextPacket = null;
                note.SendTime   = Interface.GetCurrentTime();

                WritePacketRateInfo(stream, note);

                //var start = stream.GetBitPosition();

                stream.SetStringTable(StringTable);

                //Console.WriteLine("NetConnection {0}: START {1}", NetAddress, GetClassName());

                WritePacket(stream, note);

                //Console.WriteLine("NetConnection {0}: END {1} - {2} bits", NetAddress, GetClassName(), stream.GetBitPosition() - start);
            }

            if (SymmetricCipher == null)
            {
                return;
            }

            SymmetricCipher.SetupCounter(LastSendSeq, LastSeqRecvd, (uint)packetType, 0U);

            stream.HashAndEncrypt(MessageSignatureBytes, PacketHeaderByteSize, SymmetricCipher);
        }
Exemplo n.º 10
0
        protected void WritePacketHeader(BitStream stream, NetPacketType packetType)
        {
            if (WindowFull() && packetType == NetPacketType.DataPacket)
            {
                Debugger.Break();
            }

            var ackByteCount = ((LastSeqRecvd - LastRecvAckAck + 7) >> 3);

            if (packetType == NetPacketType.DataPacket)
            {
                ++LastSendSeq;
            }

            stream.WriteInt((uint)packetType, 2);
            stream.WriteInt(LastSendSeq, 5);
            stream.WriteFlag(true);
            stream.WriteInt(LastSendSeq >> 5, SequenceNumberBitSize - 5);
            stream.WriteInt(LastSeqRecvd, AckSequenceNumberBitSize);
            stream.WriteInt(0, PacketHeaderPadBits);

            stream.WriteRangedU32(ackByteCount, 0, MaxAckByteCount);

            var wordCount = (ackByteCount + 3) >> 2;

            for (var i = 0U; i < wordCount; ++i)
            {
                stream.WriteInt(AckMask[i], (byte)(i == wordCount - 1 ? (ackByteCount - (i * 4)) * 8 : 32));
            }

            var sendDelay = Interface.GetCurrentTime() - LastPacketRecvTime;

            if (sendDelay > 2047)
            {
                sendDelay = 2047;
            }

            stream.WriteInt((uint)sendDelay >> 3, 8);

            if (packetType == NetPacketType.DataPacket)
            {
                LastSeqRecvdAtSend[LastSendSeq & PacketWindowMask] = LastSeqRecvd;
            }
        }
 internal NetOutboundPacket(NetDeliveryMethod deliveryMethod, NetPacketType type)
 {
     DeliveryMethod = deliveryMethod;
     Type           = type;
 }
Exemplo n.º 12
0
 /// <summary>
 /// Unregister an external handler for the given packet type.
 /// </summary>
 /// <param name="type">packet type</param>
 /// <param name="handler">function to remove</param>
 public static void Unregister(NetPacketType type, MessageDelegate handler)
 {
     instance.baseServer.Unbind(type, handler);
 }
Exemplo n.º 13
0
   // Params:
   //    Accept: 0, 0
   //    Disconnect: InternalReason, UserReason
   //    Ping: PingSeq, Loss
   //    Pong: PingSeq, Dropped
   internal static int PackProtocol(
 byte[] buffer,
 NetPacketType type, 
 byte firstParam, 
 byte secondParam)
   {
       buffer[0] = (byte)type;
         buffer[1] = firstParam;
         buffer[2] = secondParam;
         return NetEncoding.PROTOCOL_HEADER_SIZE;
   }
Exemplo n.º 14
0
 public PacketBase(NetPacketType type, int sender)
 {
     this.type   = type;
     this.sender = sender;
 }
Exemplo n.º 15
0
 public PacketPlayer(int sender, NetPacketType type, Player player) : base(type, sender)
 {
     this.player = player;
 }
Exemplo n.º 16
0
        public override void HandlePacket(BinaryReader reader, int whoAmI)
        {
            NetPacketType type = (NetPacketType)reader.ReadByte();

            if (type != NetPacketType.Custom)
            {
                //Currently only server can said us what we should do
                if (whoAmI != 256)
                {
                    return;
                }
            }

            if (type == NetPacketType.EventWasStarted)
            {
                var name = reader.ReadString();
                foreach (WorldEvent it in EventsPool)
                {
                    if (it.GetType().Name == name)
                    {
                        ModContent.GetInstance <EventWorld>().StartWorldEvent(it);
                        break;
                    }
                }

                if (ModContent.GetInstance <EventWorld>().CurrentEvent == null)
                {
                    Main.NewText(
                        $"WARNING! You ether or disable FunMode or you are using outdated version of mod, what haven't an {name} event! Switching to NoSync mode...");
                }

                ModContent.GetInstance <EventWorld>().CurrentEvent.TimeLeft = reader.ReadInt32();
                InvasionType invType = (InvasionType)reader.ReadByte();
                if (invType == InvasionType.Invasion)
                {
                    Main.invasionProgressWave = reader.ReadInt32();
                    Main.invasionSizeStart    = reader.ReadInt32();
                    Main.invasionSize         = reader.ReadInt32();
                    Main.invasionType         = reader.ReadInt32();
                    Main.invasionX            = reader.ReadDouble();
                    Main.invasionProgress     = reader.ReadInt32();
                }
            }
            else if (type == NetPacketType.EventWaveUpdated)
            {
                var name = reader.ReadString();
                if (ModContent.GetInstance <EventWorld>().CurrentEvent == null ||
                    ModContent.GetInstance <EventWorld>().CurrentEvent.GetType().Name != name)
                {
                    //if (ModContent.GetInstance<EventWorld>().CurrentEvent == null)
                    //    Main.NewText($"WARNING! Currently you wont have any executing event, but server send wave update for {name} event!");
                    if (ModContent.GetInstance <EventWorld>().CurrentEvent.GetType().Name != name)
                    {
                        Main.NewText(
                            $"ERROR! Currently executing event not the same what server sends! Executed event is: {ModContent.GetInstance<EventWorld>().CurrentEvent.GetType().Name}. Server has {name} event!");
                        ModContent.GetInstance <EventWorld>().CurrentEvent
                        .EventEnd(ModContent.GetInstance <EventWorld>(), this);
                        ModContent.GetInstance <EventWorld>().CurrentEvent = null;
                    }


                    foreach (WorldEvent it in EventsPool)
                    {
                        if (it.GetType().Name == name)
                        {
                            ModContent.GetInstance <EventWorld>().StartWorldEvent(it);
                            break;
                        }
                    }

                    if (ModContent.GetInstance <EventWorld>().CurrentEvent == null)
                    {
                        //Main.NewText($"WARNING! You ether or disable FunMode or you are using outdated version of mod, what haven't an {name} event!");
                    }
                }

                ModContent.GetInstance <EventWorld>().CurrentEvent.TimeLeft = reader.ReadInt32();
                InvasionType invType = (InvasionType)reader.ReadByte();
                if (invType == InvasionType.Invasion)
                {
                    Main.invasionProgressWave = reader.ReadInt32();
                    Main.invasionSizeStart    = reader.ReadInt32();
                    Main.invasionSize         = reader.ReadInt32();
                    Main.invasionType         = reader.ReadInt32();
                    Main.invasionX            = reader.ReadDouble();
                    Main.invasionProgress     = reader.ReadInt32();
                    ModContent.GetInstance <EventWorld>().CurrentEvent.OnWaveChange();
                }
            }
            else if (type == NetPacketType.EventEnded)
            {
                var name = reader.ReadString();
                if (ModContent.GetInstance <EventWorld>().CurrentEvent == null ||
                    ModContent.GetInstance <EventWorld>().CurrentEvent.GetType().Name != name)
                {
                    if (ModContent.GetInstance <EventWorld>().CurrentEvent == null)
                    {
                        Main.NewText(
                            $"WARNING! Currently you wont have any executing event, but server send event end for {name} event!");
                    }
                    if (ModContent.GetInstance <EventWorld>().CurrentEvent.GetType().Name != name)
                    {
                        Main.NewText(
                            $"ERROR! Currently executing event not the same what server sends! Executed event is: {ModContent.GetInstance<EventWorld>().CurrentEvent.GetType().Name}. Server has {name} event!");
                        ModContent.GetInstance <EventWorld>().CurrentEvent
                        .EventEnd(ModContent.GetInstance <EventWorld>(), this);
                        ModContent.GetInstance <EventWorld>().CurrentEvent = null;
                    }
                }
                else
                {
                    ModContent.GetInstance <EventWorld>().CurrentEvent
                    .EventEnd(ModContent.GetInstance <EventWorld>(), this);
                    ModContent.GetInstance <EventWorld>().CurrentEvent = null;
                }
            }
            else if (type == NetPacketType.Custom)
            {
                #region Constants

                const string lunarSky   = "LunarSkies";
                const string netSendFix = "NetSend";

                #endregion

                var eve = reader.ReadString();
                if (eve == lunarSky)
                {
                    LunarSkies t = (LunarSkies)reader.ReadByte();
                    EventPlayer.LunarSky = t;
                }
                else if (eve == netSendFix)
                {
                    var b = reader.ReadBoolean();
                    if (b)
                    {
                        ModPacket p = GetPacket();
                        p.Write((byte)NetPacketType.Custom);
                        p.Write(netSendFix);
                        p.Write(false);
                        ModContent.GetInstance <EventWorld>().WriteNetSendData(p);
                        p.Send(whoAmI);
                    }
                    else
                    {
                        ModContent.GetInstance <EventWorld>().NetReceive(reader);
                    }
                }
            }
        }
Exemplo n.º 17
0
 bool CanLogSend(NetPacketType type)
 {
     return((type != NetPacketType.AckResponse || NetLogger.LogAcks) &&
            type != NetPacketType.MTUTest);
 }
Exemplo n.º 18
0
 bool IsPingPacket(NetPacketType type)
 {
     return(type == NetPacketType.PingRequest ||
            type == NetPacketType.PingResponse);
 }
Exemplo n.º 19
0
 bool IsRemotePacket(NetPacketType type)
 {
     return(type == NetPacketType.RemoteEvent ||
            type == NetPacketType.RemoteFunction ||
            type == NetPacketType.RemoteFunctionResponse);
 }
Exemplo n.º 20
0
        public override void OnNetworkReceive(NetPeer peer, NetDataReader reader)
        {
            NetPacketType type = (NetPacketType)reader.GetUShort();

            HandleEvent(type, peer, new NetEventArgs(reader));
        }
Exemplo n.º 21
0
 /// <summary>
 /// Register an external handler for the given packet type.
 /// </summary>
 /// <param name="type">packet type</param>
 /// <param name="handler">function to add</param>
 public static void Register(NetPacketType type, MessageDelegate handler)
 {
     instance.baseClient.Bind(type, handler);
 }