From d780964cb4979abfdf501dc72f16abe1106f6130 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Mon, 10 Jun 2019 17:28:49 -0700 Subject: [PATCH] Reset NodeList upon local nework change; abort current socket when rebinding Also ensure QUdpSocket is owned by LimitedNodeList. --- libraries/networking/src/LimitedNodeList.cpp | 1 + libraries/networking/src/udt/Socket.cpp | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 2f1a8c9d10..9b1f011680 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -1239,6 +1239,7 @@ void LimitedNodeList::setLocalSocket(const HifiSockAddr& sockAddr) { } else { qCInfo(networking) << "Local socket has changed from" << _localSockAddr << "to" << sockAddr; if (_hasTCPCheckedLocalSocket) { // Force a port change for NAT: + reset(); _nodeSocket.rebind(0); _localSockAddr.setPort(_nodeSocket.localPort()); } diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index 75d4c9ef45..bcc2293e1f 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -33,6 +33,7 @@ using namespace udt; Socket::Socket(QObject* parent, bool shouldChangeSocketOptions) : QObject(parent), + _udpSocket(parent), _readyReadBackupTimer(new QTimer(this)), _shouldChangeSocketOptions(shouldChangeSocketOptions) { @@ -50,6 +51,7 @@ Socket::Socket(QObject* parent, bool shouldChangeSocketOptions) : } void Socket::bind(const QHostAddress& address, quint16 port) { + _udpSocket.bind(address, port); if (_shouldChangeSocketOptions) { @@ -72,8 +74,7 @@ void Socket::rebind() { } void Socket::rebind(quint16 localPort) { - _udpSocket.close(); - _udpSocket.waitForDisconnected(); + _udpSocket.abort(); bind(QHostAddress::AnyIPv4, localPort); }