mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 20:48:56 +02:00
add a forced failover for hanging STUN dns lookup
This commit is contained in:
parent
84505c49c4
commit
8fd309027f
3 changed files with 27 additions and 13 deletions
|
@ -22,14 +22,14 @@ HifiSockAddr::HifiSockAddr() :
|
||||||
_address(),
|
_address(),
|
||||||
_port(0)
|
_port(0)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HifiSockAddr::HifiSockAddr(const QHostAddress& address, quint16 port) :
|
HifiSockAddr::HifiSockAddr(const QHostAddress& address, quint16 port) :
|
||||||
_address(address),
|
_address(address),
|
||||||
_port(port)
|
_port(port)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HifiSockAddr::HifiSockAddr(const HifiSockAddr& otherSockAddr) :
|
HifiSockAddr::HifiSockAddr(const HifiSockAddr& otherSockAddr) :
|
||||||
|
@ -37,7 +37,7 @@ HifiSockAddr::HifiSockAddr(const HifiSockAddr& otherSockAddr) :
|
||||||
_address(otherSockAddr._address),
|
_address(otherSockAddr._address),
|
||||||
_port(otherSockAddr._port)
|
_port(otherSockAddr._port)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HifiSockAddr& HifiSockAddr::operator=(const HifiSockAddr& rhsSockAddr) {
|
HifiSockAddr& HifiSockAddr::operator=(const HifiSockAddr& rhsSockAddr) {
|
||||||
|
@ -66,7 +66,7 @@ HifiSockAddr::HifiSockAddr(const QString& hostname, quint16 hostOrderPort, bool
|
||||||
|
|
||||||
HifiSockAddr::HifiSockAddr(const sockaddr* sockaddr) {
|
HifiSockAddr::HifiSockAddr(const sockaddr* sockaddr) {
|
||||||
_address = QHostAddress(sockaddr);
|
_address = QHostAddress(sockaddr);
|
||||||
|
|
||||||
if (sockaddr->sa_family == AF_INET) {
|
if (sockaddr->sa_family == AF_INET) {
|
||||||
_port = ntohs(reinterpret_cast<const sockaddr_in*>(sockaddr)->sin_port);
|
_port = ntohs(reinterpret_cast<const sockaddr_in*>(sockaddr)->sin_port);
|
||||||
} else {
|
} else {
|
||||||
|
@ -76,7 +76,7 @@ HifiSockAddr::HifiSockAddr(const sockaddr* sockaddr) {
|
||||||
|
|
||||||
void HifiSockAddr::swap(HifiSockAddr& otherSockAddr) {
|
void HifiSockAddr::swap(HifiSockAddr& otherSockAddr) {
|
||||||
using std::swap;
|
using std::swap;
|
||||||
|
|
||||||
swap(_address, otherSockAddr._address);
|
swap(_address, otherSockAddr._address);
|
||||||
swap(_port, otherSockAddr._port);
|
swap(_port, otherSockAddr._port);
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ void HifiSockAddr::handleLookupResult(const QHostInfo& hostInfo) {
|
||||||
qCDebug(networking) << "Lookup failed for" << hostInfo.lookupId() << ":" << hostInfo.errorString();
|
qCDebug(networking) << "Lookup failed for" << hostInfo.lookupId() << ":" << hostInfo.errorString();
|
||||||
emit lookupFailed();
|
emit lookupFailed();
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(const QHostAddress& address, hostInfo.addresses()) {
|
foreach(const QHostAddress& address, hostInfo.addresses()) {
|
||||||
// just take the first IPv4 address
|
// just take the first IPv4 address
|
||||||
if (address.protocol() == QAbstractSocket::IPv4Protocol) {
|
if (address.protocol() == QAbstractSocket::IPv4Protocol) {
|
||||||
|
@ -119,9 +119,9 @@ QDataStream& operator>>(QDataStream& dataStream, HifiSockAddr& sockAddr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
QHostAddress getLocalAddress() {
|
QHostAddress getLocalAddress() {
|
||||||
|
|
||||||
QHostAddress localAddress;
|
QHostAddress localAddress;
|
||||||
|
|
||||||
foreach(const QNetworkInterface &networkInterface, QNetworkInterface::allInterfaces()) {
|
foreach(const QNetworkInterface &networkInterface, QNetworkInterface::allInterfaces()) {
|
||||||
if (networkInterface.flags() & QNetworkInterface::IsUp
|
if (networkInterface.flags() & QNetworkInterface::IsUp
|
||||||
&& networkInterface.flags() & QNetworkInterface::IsRunning
|
&& networkInterface.flags() & QNetworkInterface::IsRunning
|
||||||
|
@ -131,19 +131,19 @@ QHostAddress getLocalAddress() {
|
||||||
foreach(const QNetworkAddressEntry &entry, networkInterface.addressEntries()) {
|
foreach(const QNetworkAddressEntry &entry, networkInterface.addressEntries()) {
|
||||||
// make sure it's an IPv4 address that isn't the loopback
|
// make sure it's an IPv4 address that isn't the loopback
|
||||||
if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol && !entry.ip().isLoopback()) {
|
if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol && !entry.ip().isLoopback()) {
|
||||||
|
|
||||||
// set our localAddress and break out
|
// set our localAddress and break out
|
||||||
localAddress = entry.ip();
|
localAddress = entry.ip();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!localAddress.isNull()) {
|
if (!localAddress.isNull()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// return the looked up local address
|
// return the looked up local address
|
||||||
return localAddress;
|
return localAddress;
|
||||||
}
|
}
|
||||||
|
|
|
@ -743,6 +743,14 @@ void LimitedNodeList::startSTUNPublicSocketUpdate() {
|
||||||
// if we don't know the STUN IP yet we need to have ourselves be called once it is known
|
// if we don't know the STUN IP yet we need to have ourselves be called once it is known
|
||||||
if (_stunSockAddr.getAddress().isNull()) {
|
if (_stunSockAddr.getAddress().isNull()) {
|
||||||
connect(&_stunSockAddr, &HifiSockAddr::lookupCompleted, this, &LimitedNodeList::startSTUNPublicSocketUpdate);
|
connect(&_stunSockAddr, &HifiSockAddr::lookupCompleted, this, &LimitedNodeList::startSTUNPublicSocketUpdate);
|
||||||
|
|
||||||
|
// in case we just completely fail to lookup the stun socket - add a 10s timeout that will trigger the fail case
|
||||||
|
const quint64 STUN_DNS_LOOKUP_TIMEOUT_MSECS = 10 * 1000;
|
||||||
|
|
||||||
|
QTimer* stunLookupFailTimer = new QTimer(this);
|
||||||
|
connect(stunLookupFailTimer, &QTimer::timeout, this, &LimitedNodeList::possiblyTimeoutSTUNAddressLookup);
|
||||||
|
stunLookupFailTimer->start(STUN_DNS_LOOKUP_TIMEOUT_MSECS);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// setup our initial STUN timer here so we can quickly find out our public IP address
|
// setup our initial STUN timer here so we can quickly find out our public IP address
|
||||||
_initialSTUNTimer = new QTimer(this);
|
_initialSTUNTimer = new QTimer(this);
|
||||||
|
@ -758,6 +766,13 @@ void LimitedNodeList::startSTUNPublicSocketUpdate() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LimitedNodeList::possiblyTimeoutSTUNAddressLookup() {
|
||||||
|
if (_stunSockAddr.getAddress().isNull()) {
|
||||||
|
// our stun address is still NULL, but we've been waiting for long enough - time to force a fail
|
||||||
|
stopInitialSTUNUpdate(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void LimitedNodeList::stopInitialSTUNUpdate(bool success) {
|
void LimitedNodeList::stopInitialSTUNUpdate(bool success) {
|
||||||
_hasCompletedInitialSTUN = true;
|
_hasCompletedInitialSTUN = true;
|
||||||
|
|
||||||
|
@ -777,8 +792,6 @@ void LimitedNodeList::stopInitialSTUNUpdate(bool success) {
|
||||||
flagTimeForConnectionStep(ConnectionStep::SetPublicSocketFromSTUN);
|
flagTimeForConnectionStep(ConnectionStep::SetPublicSocketFromSTUN);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(_initialSTUNTimer);
|
|
||||||
|
|
||||||
// stop our initial fast timer
|
// stop our initial fast timer
|
||||||
if (_initialSTUNTimer) {
|
if (_initialSTUNTimer) {
|
||||||
_initialSTUNTimer->stop();
|
_initialSTUNTimer->stop();
|
||||||
|
|
|
@ -317,6 +317,7 @@ protected:
|
||||||
}
|
}
|
||||||
private slots:
|
private slots:
|
||||||
void flagTimeForConnectionStep(ConnectionStep connectionStep, quint64 timestamp);
|
void flagTimeForConnectionStep(ConnectionStep connectionStep, quint64 timestamp);
|
||||||
|
void possiblyTimeoutSTUNAddressLookup();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_LimitedNodeList_h
|
#endif // hifi_LimitedNodeList_h
|
||||||
|
|
Loading…
Reference in a new issue