diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 6d9de2dbc1..2d90423a00 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -606,6 +606,12 @@ SharedNodePointer LimitedNodeList::addOrUpdateNode(const QUuid& uuid, NodeType_t }); } + // Signal when a socket changes, so we can start the hole punch over. + auto weakPtr = newNodePointer.toWeakRef(); // We don't want the lambda to hold a strong ref + connect(newNodePointer.data(), &NetworkPeer::socketUpdated, this, [=] { + emit nodeUpdated(weakPtr); + }); + return newNodePointer; } } diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 49a3a155a2..85b4e718bf 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -250,6 +250,7 @@ signals: void uuidChanged(const QUuid& ownerUUID, const QUuid& oldUUID); void nodeAdded(SharedNodePointer); + void nodeUpdated(SharedNodePointer); void nodeKilled(SharedNodePointer); void nodeActivated(SharedNodePointer); diff --git a/libraries/networking/src/NetworkPeer.cpp b/libraries/networking/src/NetworkPeer.cpp index da2eced05c..2ebee1b71f 100644 --- a/libraries/networking/src/NetworkPeer.cpp +++ b/libraries/networking/src/NetworkPeer.cpp @@ -63,6 +63,7 @@ void NetworkPeer::setPublicSocket(const HifiSockAddr& publicSocket) { if (!wasOldSocketNull) { qCDebug(networking) << "Public socket change for node" << *this; + emit socketUpdated(); } } } @@ -82,6 +83,7 @@ void NetworkPeer::setLocalSocket(const HifiSockAddr& localSocket) { if (!wasOldSocketNull) { qCDebug(networking) << "Local socket change for node" << *this; + emit socketUpdated(); } } } @@ -101,6 +103,7 @@ void NetworkPeer::setSymmetricSocket(const HifiSockAddr& symmetricSocket) { if (!wasOldSocketNull) { qCDebug(networking) << "Symmetric socket change for node" << *this; + emit socketUpdated(); } } } diff --git a/libraries/networking/src/NetworkPeer.h b/libraries/networking/src/NetworkPeer.h index 8298a2dad4..7185ffef29 100644 --- a/libraries/networking/src/NetworkPeer.h +++ b/libraries/networking/src/NetworkPeer.h @@ -81,9 +81,12 @@ public: public slots: void startPingTimer(); void stopPingTimer(); + signals: void pingTimerTimeout(); void socketActivated(const HifiSockAddr& sockAddr); + void socketUpdated(); + protected: void setActiveSocket(HifiSockAddr* discoveredSocket); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 3a07ea8b54..44c7e8e0cf 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -93,6 +93,7 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned // anytime we get a new node we will want to attempt to punch to it connect(this, &LimitedNodeList::nodeAdded, this, &NodeList::startNodeHolePunch); + connect(this, &LimitedNodeList::nodeUpdated, this, &NodeList::startNodeHolePunch); // anytime we get a new node we may need to re-send our set of ignored node IDs to it connect(this, &LimitedNodeList::nodeActivated, this, &NodeList::maybeSendIgnoreSetToNode);