mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 16:41:02 +02:00
Merge pull request #15708 from SimonWalton-HiFi/stun-on-iface-change
Force new IP port on local address change
This commit is contained in:
commit
b95515933f
3 changed files with 18 additions and 5 deletions
|
@ -739,6 +739,10 @@ void DomainServer::setupNodeListAndAssignments() {
|
||||||
|
|
||||||
connect(nodeList.data(), &LimitedNodeList::nodeAdded, this, &DomainServer::nodeAdded);
|
connect(nodeList.data(), &LimitedNodeList::nodeAdded, this, &DomainServer::nodeAdded);
|
||||||
connect(nodeList.data(), &LimitedNodeList::nodeKilled, this, &DomainServer::nodeKilled);
|
connect(nodeList.data(), &LimitedNodeList::nodeKilled, this, &DomainServer::nodeKilled);
|
||||||
|
connect(nodeList.data(), &LimitedNodeList::localSockAddrChanged, this,
|
||||||
|
[this](const HifiSockAddr& localSockAddr) {
|
||||||
|
DependencyManager::get<LimitedNodeList>()->putLocalPortIntoSharedMemory(DOMAIN_SERVER_LOCAL_PORT_SMEM_KEY, this, localSockAddr.getPort());
|
||||||
|
});
|
||||||
|
|
||||||
// register as the packet receiver for the types we want
|
// register as the packet receiver for the types we want
|
||||||
PacketReceiver& packetReceiver = nodeList->getPacketReceiver();
|
PacketReceiver& packetReceiver = nodeList->getPacketReceiver();
|
||||||
|
|
|
@ -996,7 +996,7 @@ void LimitedNodeList::sendSTUNRequest() {
|
||||||
const int NUM_INITIAL_STUN_REQUESTS_BEFORE_FAIL = 10;
|
const int NUM_INITIAL_STUN_REQUESTS_BEFORE_FAIL = 10;
|
||||||
|
|
||||||
if (!_hasCompletedInitialSTUN) {
|
if (!_hasCompletedInitialSTUN) {
|
||||||
qCDebug(networking) << "Sending intial stun request to" << STUN_SERVER_HOSTNAME;
|
qCDebug(networking) << "Sending initial stun request to" << STUN_SERVER_HOSTNAME;
|
||||||
|
|
||||||
if (_numInitialSTUNRequests > NUM_INITIAL_STUN_REQUESTS_BEFORE_FAIL) {
|
if (_numInitialSTUNRequests > NUM_INITIAL_STUN_REQUESTS_BEFORE_FAIL) {
|
||||||
// we're still trying to do our initial STUN we're over the fail threshold
|
// we're still trying to do our initial STUN we're over the fail threshold
|
||||||
|
@ -1185,7 +1185,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.
|
// 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
|
// 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 };
|
QTimer* stunOccasionalTimer = new QTimer { this };
|
||||||
connect(stunOccasionalTimer, &QTimer::timeout, this, &LimitedNodeList::sendSTUNRequest);
|
connect(stunOccasionalTimer, &QTimer::timeout, this, &LimitedNodeList::sendSTUNRequest);
|
||||||
|
@ -1243,15 +1243,22 @@ void LimitedNodeList::errorTestingLocalSocket() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void LimitedNodeList::setLocalSocket(const HifiSockAddr& sockAddr) {
|
void LimitedNodeList::setLocalSocket(const HifiSockAddr& sockAddr) {
|
||||||
if (sockAddr != _localSockAddr) {
|
if (sockAddr.getAddress() != _localSockAddr.getAddress()) {
|
||||||
|
|
||||||
if (_localSockAddr.isNull()) {
|
if (_localSockAddr.isNull()) {
|
||||||
qCInfo(networking) << "Local socket is" << sockAddr;
|
qCInfo(networking) << "Local socket is" << sockAddr;
|
||||||
|
_localSockAddr = sockAddr;
|
||||||
} else {
|
} else {
|
||||||
qCInfo(networking) << "Local socket has changed from" << _localSockAddr << "to" << sockAddr;
|
qCInfo(networking) << "Local socket has changed from" << _localSockAddr << "to" << sockAddr;
|
||||||
|
_localSockAddr = sockAddr;
|
||||||
|
if (_hasTCPCheckedLocalSocket) { // Force a port change for NAT:
|
||||||
|
reset();
|
||||||
|
_nodeSocket.rebind(0);
|
||||||
|
_localSockAddr.setPort(_nodeSocket.localPort());
|
||||||
|
qCInfo(networking) << "Local port changed to" << _localSockAddr.getPort();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_localSockAddr = sockAddr;
|
|
||||||
emit localSockAddrChanged(_localSockAddr);
|
emit localSockAddrChanged(_localSockAddr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ using namespace udt;
|
||||||
|
|
||||||
Socket::Socket(QObject* parent, bool shouldChangeSocketOptions) :
|
Socket::Socket(QObject* parent, bool shouldChangeSocketOptions) :
|
||||||
QObject(parent),
|
QObject(parent),
|
||||||
|
_udpSocket(parent),
|
||||||
_readyReadBackupTimer(new QTimer(this)),
|
_readyReadBackupTimer(new QTimer(this)),
|
||||||
_shouldChangeSocketOptions(shouldChangeSocketOptions)
|
_shouldChangeSocketOptions(shouldChangeSocketOptions)
|
||||||
{
|
{
|
||||||
|
@ -50,6 +51,7 @@ Socket::Socket(QObject* parent, bool shouldChangeSocketOptions) :
|
||||||
}
|
}
|
||||||
|
|
||||||
void Socket::bind(const QHostAddress& address, quint16 port) {
|
void Socket::bind(const QHostAddress& address, quint16 port) {
|
||||||
|
|
||||||
_udpSocket.bind(address, port);
|
_udpSocket.bind(address, port);
|
||||||
|
|
||||||
if (_shouldChangeSocketOptions) {
|
if (_shouldChangeSocketOptions) {
|
||||||
|
@ -75,7 +77,7 @@ void Socket::rebind() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Socket::rebind(quint16 localPort) {
|
void Socket::rebind(quint16 localPort) {
|
||||||
_udpSocket.close();
|
_udpSocket.abort();
|
||||||
bind(QHostAddress::AnyIPv4, localPort);
|
bind(QHostAddress::AnyIPv4, localPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue