From 498d681d3e8d740cb8fb0d35d1ba3959ff93da56 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Fri, 7 Jun 2019 12:04:04 -0700 Subject: [PATCH] Force new IP port on local address change --- libraries/networking/src/LimitedNodeList.cpp | 8 ++++++-- libraries/networking/src/udt/Socket.cpp | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 0eda2ee2e0..97a12e4c71 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -1172,7 +1172,7 @@ void LimitedNodeList::stopInitialSTUNUpdate(bool success) { // We now setup a timer here to fire every so often to check that our IP address has not changed. // Or, if we failed - if will check if we can eventually get a public socket - const int STUN_IP_ADDRESS_CHECK_INTERVAL_MSECS = 30 * 1000; + const int STUN_IP_ADDRESS_CHECK_INTERVAL_MSECS = 10 * 1000; QTimer* stunOccasionalTimer = new QTimer { this }; connect(stunOccasionalTimer, &QTimer::timeout, this, &LimitedNodeList::sendSTUNRequest); @@ -1230,12 +1230,16 @@ void LimitedNodeList::errorTestingLocalSocket() { } void LimitedNodeList::setLocalSocket(const HifiSockAddr& sockAddr) { - if (sockAddr != _localSockAddr) { + if (sockAddr.getAddress() != _localSockAddr.getAddress()) { if (_localSockAddr.isNull()) { qCInfo(networking) << "Local socket is" << sockAddr; } else { qCInfo(networking) << "Local socket has changed from" << _localSockAddr << "to" << sockAddr; + if (_hasTCPCheckedLocalSocket) { // Force a port change for NAT: + _nodeSocket.rebind(0); + _localSockAddr.setPort(_nodeSocket.localPort()); + } } _localSockAddr = sockAddr; diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index 98d6c0a6be..5a3111a7eb 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -73,6 +73,7 @@ void Socket::rebind() { void Socket::rebind(quint16 localPort) { _udpSocket.close(); + _udpSocket.waitForDisconnected(); bind(QHostAddress::AnyIPv4, localPort); }