feat: NetworkMointor::validAddresses, return the useable ip4 and ip6 address

This commit is contained in:
sithlord48
2026-02-21 09:29:41 -05:00
committed by Nick Bolton
parent 3c140ed479
commit fb60189078
2 changed files with 32 additions and 13 deletions

View File

@ -54,8 +54,10 @@ void NetworkMonitor::stopMonitoring()
QStringList NetworkMonitor::validAddresses() const
{
QList<QHostAddress> physicalIPs;
QList<QHostAddress> virtualIPs;
QList<QHostAddress> physicalIP4;
QList<QHostAddress> physicalIP6;
QList<QHostAddress> virtualIP4;
QList<QHostAddress> virtualIP6;
QSet<QHostAddress> 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) {

View File

@ -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;