diff --git a/src/utils/Platform.cpp b/src/utils/Platform.cpp index 8790e4e1..5dc21dff 100644 --- a/src/utils/Platform.cpp +++ b/src/utils/Platform.cpp @@ -28,19 +28,31 @@ std::string Utils::Platform::GetLocalAddress() validAddresses.push_back(address.toString()); } + // Return early if no valid addresses were found + if (validAddresses.size() == 0) + return "0.0.0.0"; + + std::vector> preferredAddresses; for (auto address : validAddresses) { - // Hacks to try to pick the best address - if (address.startsWith("192.168")) { - return address.toStdString(); - } else if (address.startsWith("172.16")) { - return address.toStdString(); + // Attribute a priority (0 is best) to the address to choose the best picks + if (address.startsWith("192.168.1") || address.startsWith("192.168.0")) { // Prefer common consumer router network prefixes + preferredAddresses.push_back(std::make_pair(address, 0)); + } else if (address.startsWith("172.16")) { // Slightly less common consumer router network prefixes + preferredAddresses.push_back(std::make_pair(address, 1)); + } else if (address.startsWith("10.")) { // Even less common consumer router network prefixes + preferredAddresses.push_back(std::make_pair(address, 2)); + } else { // Set all other addresses to equal priority + preferredAddresses.push_back(std::make_pair(address, 255)); } } - if (validAddresses.size() > 0) - return validAddresses[0].toStdString(); + // Sort by priority + std::sort(preferredAddresses.begin(), preferredAddresses.end(), [=](std::pair a, std::pair b) { + return a.second < b.second; + }); - return "0.0.0.0"; + // Return highest priority address + return preferredAddresses[0].first.toStdString(); } QString Utils::Platform::GetCommandLineArgument(QString arg)