public void NatIntroduce(IPEndPoint hostInternal, IPEndPoint hostExternal, IPEndPoint clientInternal, IPEndPoint clientExternal, string additionalInfo) { var req = new NatIntroduceResponsePacket { Token = additionalInfo }; //First packet (server) send to client req.Internal = hostInternal; req.External = hostExternal; Send(req, clientExternal); //Second packet (client) send to server req.Internal = clientInternal; req.External = clientExternal; Send(req, hostExternal); }
//We got introduce and must punch private void OnNatIntroductionResponse(NatIntroduceResponsePacket req) { NetDebug.Write(NetLogLevel.Trace, "[NAT] introduction received"); // send internal punch var punchPacket = new NatPunchPacket { Token = req.Token }; Send(punchPacket, req.Internal); NetDebug.Write(NetLogLevel.Trace, "[NAT] internal punch sent to " + req.Internal); // hack for some routers _socket.Ttl = 2; _socket.SendRaw(new[] { (byte)PacketProperty.Empty }, 0, 1, req.External); // send external punch _socket.Ttl = NetConstants.SocketTTL; punchPacket.IsExternal = true; Send(punchPacket, req.External); NetDebug.Write(NetLogLevel.Trace, "[NAT] external punch sent to " + req.External); }