diff --git a/animation-server/src/main.cpp b/animation-server/src/main.cpp index 281c761c00..a77be03aa5 100644 --- a/animation-server/src/main.cpp +++ b/animation-server/src/main.cpp @@ -858,9 +858,10 @@ int main(int argc, const char * argv[]) } // Nodes sending messages to us... - if ((receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, - nodeSockAddr.getAddressPointer(), - nodeSockAddr.getPortPointer())) && + if (nodeList->getNodeSocket().hasPendingDatagrams() + && (receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, + nodeSockAddr.getAddressPointer(), + nodeSockAddr.getPortPointer())) && packetVersionMatch(packetData)) { if (packetData[0] == PACKET_TYPE_VOXEL_JURISDICTION) { diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index bedaab87c4..24934397ad 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -147,10 +147,11 @@ void Agent::run() { qDebug() << "Uncaught exception at line" << line << ":" << engine.uncaughtException().toString() << "\n"; } - while ((receivedBytes = NodeList::getInstance()->getNodeSocket().readDatagram((char*) receivedBytes, - MAX_PACKET_SIZE, - senderSockAddr.getAddressPointer(), - senderSockAddr.getPortPointer())) + while (nodeList->getNodeSocket().hasPendingDatagrams() && + (receivedBytes = nodeList->getNodeSocket().readDatagram((char*) receivedBytes, + MAX_PACKET_SIZE, + senderSockAddr.getAddressPointer(), + senderSockAddr.getPortPointer())) && packetVersionMatch(receivedData)) { if (receivedData[0] == PACKET_TYPE_VOXEL_JURISDICTION) { voxelScripter.getJurisdictionListener()->queueReceivedPacket(senderSockAddr, diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 0d11a63344..3c325e7258 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -312,8 +312,10 @@ void AudioMixer::run() { } // pull any new audio data from nodes off of the network stack - while ((receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, - nodeSockAddr.getAddressPointer(), nodeSockAddr.getPortPointer())) && + while (nodeList->getNodeSocket().hasPendingDatagrams() && + (receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, + nodeSockAddr.getAddressPointer(), + nodeSockAddr.getPortPointer())) && packetVersionMatch(packetData)) { if (packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO || packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index d3e1a5bd57..9a629a8ef6 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -129,7 +129,8 @@ void AvatarMixer::run() { nodeList->possiblyPingInactiveNodes(); - if ((receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, + if (nodeList->getNodeSocket().hasPendingDatagrams() && + (receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, nodeSockAddr.getAddressPointer(), nodeSockAddr.getPortPointer())) && packetVersionMatch(packetData)) { diff --git a/assignment-client/src/main.cpp b/assignment-client/src/main.cpp index cef77610c4..ae4f569f83 100644 --- a/assignment-client/src/main.cpp +++ b/assignment-client/src/main.cpp @@ -127,7 +127,7 @@ int main(int argc, char* argv[]) { // set the custom hostname or default if it wasn't passed if (!customAssignmentServerHostname) { - customAssignmentServerHostname = LOCAL_ASSIGNMENT_SERVER_HOSTNAME; + customAssignmentServerHostname = DEFAULT_ASSIGNMENT_SERVER_HOSTNAME; } ::customAssignmentSocket = HifiSockAddr(customAssignmentServerHostname, assignmentServerPort); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 9aba991f16..175118ef7d 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -589,8 +589,6 @@ int DomainServer::run() { quint16 senderPort; HifiSockAddr nodePublicAddress, nodeLocalAddress; - - nodeList->startSilentNodeRemovalThread(); if (!_staticAssignmentFile.exists() || _voxelServerConfig) { @@ -613,7 +611,8 @@ int DomainServer::run() { gettimeofday(&startTime, NULL); while (true) { - while (nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, &senderAddress, &senderPort) && + while (nodeList->getNodeSocket().hasPendingDatagrams() + && nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, &senderAddress, &senderPort) && packetVersionMatch(packetData)) { if (packetData[0] == PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_TYPE_DOMAIN_LIST_REQUEST) { // this is an RFD or domain list request packet, and there is a version match diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 84f72242c4..c601005e8b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4305,10 +4305,11 @@ void* Application::networkReceive(void* args) { Application* app = Application::getInstance(); while (!app->_stopNetworkReceiveThread) { - if ((bytesReceived = NodeList::getInstance()->getNodeSocket().readDatagram((char*) app->_incomingPacket, - MAX_PACKET_SIZE, - senderSockAddr.getAddressPointer(), - senderSockAddr.getPortPointer()))) { + if (NodeList::getInstance()->getNodeSocket().hasPendingDatagrams() && + (bytesReceived = NodeList::getInstance()->getNodeSocket().readDatagram((char*) app->_incomingPacket, + MAX_PACKET_SIZE, + senderSockAddr.getAddressPointer(), + senderSockAddr.getPortPointer()))) { app->_packetCount++; app->_bytesCount += bytesReceived; diff --git a/libraries/shared/src/HifiSockAddr.cpp b/libraries/shared/src/HifiSockAddr.cpp index 542b4c2e52..66ae200026 100644 --- a/libraries/shared/src/HifiSockAddr.cpp +++ b/libraries/shared/src/HifiSockAddr.cpp @@ -33,10 +33,12 @@ HifiSockAddr::HifiSockAddr(const HifiSockAddr& otherSockAddr) { HifiSockAddr::HifiSockAddr(const QString& hostname, quint16 hostOrderPort) { // lookup the IP by the hostname QHostInfo hostInfo = QHostInfo::fromName(hostname); - if (!hostInfo.addresses().isEmpty()) { - // use the first IP address - _address = hostInfo.addresses().first(); - _port = hostOrderPort; } + foreach(const QHostAddress& address, hostInfo.addresses()) { + if (address.protocol() == QAbstractSocket::IPv4Protocol) { + _address = address; + _port = hostOrderPort; + } + } } HifiSockAddr& HifiSockAddr::operator=(const HifiSockAddr& rhsSockAddr) { diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 59135b05d4..8bd714cd18 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -611,8 +611,6 @@ int NodeList::processDomainServerList(unsigned char* packetData, size_t dataByte return readNodes; } -const HifiSockAddr DEFAULT_LOCAL_ASSIGNMENT_SOCKET = HifiSockAddr(QHostAddress(LOCAL_ASSIGNMENT_SERVER_HOSTNAME), - DEFAULT_DOMAIN_SERVER_PORT); void NodeList::sendAssignment(Assignment& assignment) { unsigned char assignmentPacket[MAX_PACKET_SIZE]; @@ -623,8 +621,10 @@ void NodeList::sendAssignment(Assignment& assignment) { int numHeaderBytes = populateTypeAndVersion(assignmentPacket, assignmentPacketType); int numAssignmentBytes = assignment.packToBuffer(assignmentPacket + numHeaderBytes); + static HifiSockAddr DEFAULT_ASSIGNMENT_SOCKET(DEFAULT_ASSIGNMENT_SERVER_HOSTNAME, DEFAULT_DOMAIN_SERVER_PORT); + const HifiSockAddr* assignmentServerSocket = _assignmentServerSocket.isNull() - ? &DEFAULT_LOCAL_ASSIGNMENT_SOCKET + ? &DEFAULT_ASSIGNMENT_SOCKET : &_assignmentServerSocket; _nodeSocket.writeDatagram((char*) assignmentPacket, numHeaderBytes + numAssignmentBytes, diff --git a/libraries/shared/src/NodeList.h b/libraries/shared/src/NodeList.h index 7efc4b2682..0d5d84ecfa 100644 --- a/libraries/shared/src/NodeList.h +++ b/libraries/shared/src/NodeList.h @@ -40,7 +40,7 @@ const int MAX_HOSTNAME_BYTES = 256; extern const QString DEFAULT_DOMAIN_HOSTNAME; extern const unsigned short DEFAULT_DOMAIN_SERVER_PORT; -const char LOCAL_ASSIGNMENT_SERVER_HOSTNAME[] = "localhost"; +const char DEFAULT_ASSIGNMENT_SERVER_HOSTNAME[] = "localhost"; const int MAX_SILENT_DOMAIN_SERVER_CHECK_INS = 5; diff --git a/libraries/voxel-server-library/src/VoxelServer.cpp b/libraries/voxel-server-library/src/VoxelServer.cpp index 4be9183cb9..5fd87f52ec 100644 --- a/libraries/voxel-server-library/src/VoxelServer.cpp +++ b/libraries/voxel-server-library/src/VoxelServer.cpp @@ -668,10 +668,11 @@ void VoxelServer::run() { // ping our inactive nodes to punch holes with them nodeList->possiblyPingInactiveNodes(); - if ((packetLength = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, - senderSockAddr.getAddressPointer(), - senderSockAddr.getPortPointer())) && - packetVersionMatch(packetData)) { + if (nodeList->getNodeSocket().hasPendingDatagrams() + && (packetLength = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, + senderSockAddr.getAddressPointer(), + senderSockAddr.getPortPointer())) + && packetVersionMatch(packetData)) { int numBytesPacketHeader = numBytesForPacketHeader(packetData); diff --git a/pairing-server/src/main.cpp b/pairing-server/src/main.cpp index 4efff8f588..609f9412e9 100644 --- a/pairing-server/src/main.cpp +++ b/pairing-server/src/main.cpp @@ -62,8 +62,9 @@ int main(int argc, const char* argv[]) { char senderData[MAX_PACKET_SIZE_BYTES] = {}; while (true) { - if (::serverSocket.readDatagram(senderData, MAX_PACKET_SIZE_BYTES, - senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer())) { + if (::serverSocket.hasPendingDatagrams() + && ::serverSocket.readDatagram(senderData, MAX_PACKET_SIZE_BYTES, + senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer())) { if (senderData[0] == 'A') { // this is a device reporting itself as available