コード例 #1
0
        public void AddEncapsulatedToQueue(EncapsulatedPacket packet, int flags = RakNetProtocol.FlagNormal)
        {
            if (RakNetPacketReliability.IsReliable(packet.Reliability))
            {
                packet.MessageIndex = this.MessageIndex++;
                if (RakNetPacketReliability.IsOrdered(packet.Reliability))
                {
                    packet.OrderIndex = this.OrderIndexes[packet.OrderChannel]++;
                }
            }

            if (packet.GetTotalLength() + 4 > this.MTUSize)
            {
                byte[][] buffers = Binary.SplitBytes(new MemorySpan(packet.Buffer), this.MTUSize - 60);
                int      splitID = ++this.SplitID % 65536;
                for (int i = 0; i < buffers.Length; i++)
                {
                    EncapsulatedPacket pk = new EncapsulatedPacket();
                    pk.SplitID     = splitID;
                    pk.HasSplit    = true;
                    pk.SplitCount  = buffers.Length;
                    pk.Reliability = packet.Reliability;
                    pk.SplitIndex  = i;
                    pk.Buffer      = buffers[i];
                    if (i > 0)
                    {
                        pk.MessageIndex = this.MessageIndex++;
                    }
                    else
                    {
                        pk.MessageIndex = packet.MessageIndex;
                    }

                    if (RakNetPacketReliability.IsOrdered(packet.Reliability))
                    {
                        pk.OrderChannel = packet.OrderChannel;
                        pk.OrderIndex   = packet.OrderIndex;
                    }

                    this.AddToQueue(pk, RakNetProtocol.FlagImmediate);
                }
            }
            else
            {
                this.AddToQueue(packet, flags);
            }
        }
コード例 #2
0
        public void AddToQueue(EncapsulatedPacket pk, int flags = RakNetProtocol.FlagNormal)
        {
            if (flags == RakNetProtocol.FlagImmediate)
            {
                DataPacket p = new DataPacket0();
                p.Packets = new object[] { pk };
                this.SendDatagram(p);
                return;
            }

            int length = this.SendQueue.GetLength();

            if (length + pk.GetTotalLength() > this.MTUSize - 36
                ) //IP header (20 bytes) + UDP header (8 bytes) + RakNet weird (8 bytes) = 36 bytes
            {
                this.SendQueuePacket();
            }

            List <object> list = new List <object>(this.SendQueue.Packets);

            list.Add(pk);
            this.SendQueue.Packets = list.ToArray();
        }
コード例 #3
0
        public void SendPacket(EncapsulatedPacket packet, bool notQueue = false)
        {
            if (this.server != null)
            {
                if (notQueue)
                {
                    DataPacket_0 pk = new DataPacket_0();
                    pk.SeqNumber = this.sendSeqNumber++;
                    pk.Packets   = new[]
                    {
                        packet
                    };

                    this.AddResendQueue(pk);
                    this.server.SendPacket(pk, this.point.Address, this.point.Port);
                    return;
                }
                else
                {
                    if (packet.GetTotalLength() + 4 > this.mtuSize)
                    {
                        byte[][] buffers = Binary.SplitBytes(new MemorySpan(packet.buffer), this.mtuSize - 60);
                        int      splitID = this.splitID++ % 65536;
                        for (int i = 0; i < buffers.Length; ++i)
                        {
                            EncapsulatedPacket pk = new EncapsulatedPacket();
                            pk.splitID     = splitID;
                            pk.hasSplit    = true;
                            pk.splitCount  = buffers.Length;
                            pk.reliability = PacketReliability.UNRELIABLE;
                            pk.splitIndex  = i;
                            pk.buffer      = buffers[i];
                            if (i > 0)
                            {
                                pk.messageIndex = this.messageIndex++;
                            }
                            else
                            {
                                pk.messageIndex = this.messageIndex;
                            }

                            DataPacket_0 dp = new DataPacket_0();
                            dp.SeqNumber = this.sendSeqNumber++;
                            dp.Packets   = new[]
                            {
                                pk
                            };

                            this.AddResendQueue(dp);
                            this.server.SendPacket(dp, this.point.Address, this.point.Port);
                        }
                    }
                    else
                    {
                        DataPacket_4 pk = new DataPacket_4();
                        pk.SeqNumber = this.sendSeqNumber++;
                        pk.Packets   = new[]
                        {
                            packet
                        };

                        this.packetQueue.Enqueue(pk);
                    }
                }
            }
        }