diff --git a/src/lib/gui/core/NetworkMonitor.cpp b/src/lib/gui/core/NetworkMonitor.cpp index 322330ef2..780ab18f9 100644 --- a/src/lib/gui/core/NetworkMonitor.cpp +++ b/src/lib/gui/core/NetworkMonitor.cpp @@ -54,8 +54,10 @@ void NetworkMonitor::stopMonitoring() QStringList NetworkMonitor::validAddresses() const { - QList physicalIPs; - QList virtualIPs; + QList physicalIP4; + QList physicalIP6; + QList virtualIP4; + QList virtualIP6; QSet uniqueAddresses; const auto allInterfaces = QNetworkInterface::allInterfaces(); @@ -72,33 +74,50 @@ QStringList NetworkMonitor::validAddresses() const for (const auto &entry : addressEntries) { const QHostAddress address = entry.ip(); - if (address.protocol() != QAbstractSocket::IPv4Protocol || address.isLinkLocal() || address.isLoopback() || - uniqueAddresses.contains(address)) { + if (address.isLinkLocal() || address.isLoopback() || uniqueAddresses.contains(address)) { continue; } uniqueAddresses.insert(address); - if (isVirtual) { - virtualIPs.append(address); + if (address.protocol() == QHostAddress::IPv6Protocol) { + if (isVirtual) + virtualIP6.append(address); + else + physicalIP6.append(address); } else { - physicalIPs.append(address); + if (isVirtual) + virtualIP4.append(address); + else + physicalIP4.append(address); } } } - std::ranges::sort(physicalIPs, [](const QHostAddress &a, const QHostAddress &b) { + std::ranges::sort(physicalIP4, [](const QHostAddress &a, const QHostAddress &b) { if (a.isPrivateUse() != b.isPrivateUse()) return a.isPrivateUse(); return a.toIPv4Address() < b.toIPv4Address(); }); - std::ranges::sort(virtualIPs, [](const QHostAddress &a, const QHostAddress &b) { + std::ranges::sort(virtualIP4, [](const QHostAddress &a, const QHostAddress &b) { return a.toIPv4Address() < b.toIPv4Address(); }); - auto result = physicalIPs; - result.append(virtualIPs); + std::ranges::sort(physicalIP6, [](const QHostAddress &a, const QHostAddress &b) { + if (a.isPrivateUse() != b.isPrivateUse()) + return a.isPrivateUse(); + return a.toString() < b.toString(); + }); + + std::ranges::sort(virtualIP6, [](const QHostAddress &a, const QHostAddress &b) { + return a.toString() < b.toString(); + }); + + auto result = physicalIP4; + result.append(virtualIP4); + result.append(physicalIP6); + result.append(virtualIP6); QStringList ipList; for (const auto &host : result) { diff --git a/src/lib/gui/core/NetworkMonitor.h b/src/lib/gui/core/NetworkMonitor.h index 49a19e307..ce7ac6af1 100644 --- a/src/lib/gui/core/NetworkMonitor.h +++ b/src/lib/gui/core/NetworkMonitor.h @@ -47,8 +47,8 @@ public: void stopMonitoring(); /** - * @brief Get list of all available IPv4 addresses (excluding local and link-local addresses) - * @return IPv4 address list + * @brief Get list of all available IP addresses (excluding local and link-local addresses) + * @return IP address list */ QStringList validAddresses() const;