public void NatIntroduce( NetEndPoint hostInternal, NetEndPoint hostExternal, NetEndPoint clientInternal, NetEndPoint clientExternal, string additionalInfo) { NetDataWriter dw = new NetDataWriter(); //First packet (server) //send to client dw.Put(ClientByte); dw.Put(hostInternal); dw.Put(hostExternal); dw.Put(additionalInfo, MaxTokenLength); _netBase.SendRaw(NetPacket.CreateRawPacket(PacketProperty.NatIntroduction, dw), clientExternal); //Second packet (client) //send to server dw.Reset(); dw.Put(HostByte); dw.Put(clientInternal); dw.Put(clientExternal); dw.Put(additionalInfo, MaxTokenLength); _netBase.SendRaw(NetPacket.CreateRawPacket(PacketProperty.NatIntroduction, dw), hostExternal); }
//from user thread, our thread, or recv? private void SendPacket(NetPacket packet) { switch (packet.Property) { case PacketProperty.Reliable: DebugWrite("[RS]Packet reliable"); _reliableUnorderedChannel.AddToQueue(packet); break; case PacketProperty.Sequenced: DebugWrite("[RS]Packet sequenced"); _sequencedChannel.AddToQueue(packet); break; case PacketProperty.ReliableOrdered: DebugWrite("[RS]Packet reliable ordered"); _reliableOrderedChannel.AddToQueue(packet); break; case PacketProperty.Unreliable: DebugWrite("[RS]Packet simple"); _simpleChannel.AddToQueue(packet); break; case PacketProperty.MtuCheck: //Must check result for MTU fix if (!_peerListener.SendRaw(packet.RawData, 0, packet.RawData.Length, _remoteEndPoint)) { _finishMtu = true; } Recycle(packet); break; case PacketProperty.AckReliable: case PacketProperty.AckReliableOrdered: case PacketProperty.Ping: case PacketProperty.Pong: case PacketProperty.Disconnect: case PacketProperty.MtuOk: SendRawData(packet.RawData); Recycle(packet); break; default: throw new Exception("Unknown packet property: " + packet.Property); } }
internal bool SendRawData(byte[] data) { return(_peerListener.SendRaw(data, 0, data.Length, _remoteEndPoint)); }