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); } }
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(); }
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); } } } }