//We got punch and can connect private void OnNatPunch(NatPunchPacket req, IPEndPoint senderEndPoint) { //Read info NetDebug.Write(NetLogLevel.Trace, "[NAT] punch received from {0} - additional info: {1}", senderEndPoint, req.Token); //Release punch success to client; enabling him to Connect() to Sender if token is ok if (UnsyncedEvents) { _natPunchListener.OnNatIntroductionSuccess( senderEndPoint, req.IsExternal ? NatAddressType.External : NatAddressType.Internal, req.Token ); } else { _successEvents.Enqueue(new SuccessEventData { TargetEndPoint = senderEndPoint, Type = req.IsExternal ? NatAddressType.External : NatAddressType.Internal, Token = req.Token }); } }
//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); }