Russian Qt Forum
Ноябрь 22, 2024, 19:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Кроссплатформенность QNetworkInterface::allInterfaces  (Прочитано 7467 раз)
posix
Гость
« : Январь 17, 2017, 02:43 »

Столкнулся с одной неприятностью, QNetworkInterface::allInterfaces отказывается работать в Windows 7-10 и macOS (проверял на 10.12), но нормально работает в Linux и Windows XP. В проблемных ОС вместо ip, netmask и broadcast отдается пустота. Вот пример:
Код:
foreach (const QNetworkInterface &iface, QNetworkInterface::allInterfaces()) {
    QList<QNetworkAddressEntry> entries = iface.addressEntries();
    if (!entries.isEmpty()) {
        QNetworkAddressEntry entry = entries.first();
        if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol && entry.ip() != QHostAddress(QHostAddress::LocalHost)) {
           QString ip = entry.ip().toString();
           QString netmask = entry.netmask().toString();
           QString broadcast = entry.broadcast().toString();

           qDebug() << "ip: " << ip;
           qDebug() << "netmask: " << netmask;
           qDebug() << "broadcast: " << broadcast;
        }
    }
}

А вот если перебирать QNetworkInterface::allAddresses, то все одинаково работает на всех ОС:
Код:
foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) {
    if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost)){
        QString ip = address.toString();
       
        qDebug() << "ip: " << ip;
    }
}
Но тут не получить netmask и broadcast.

Думал, может это связано с безопасностью, пробовал запускать приложение с повышенными привилегиями, но безрезультатно.

Может кто сталкивался, существует ли решение этой проблемы?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Январь 17, 2017, 11:25 »

пальцем в небо: сборка программы для венды чем и разрядность ?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Январь 17, 2017, 13:06 »

в макос все работает, тестил на 10.11 и 10.12 недавно, Qt 5.6
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
posix
Гость
« Ответ #3 : Январь 17, 2017, 13:41 »

пальцем в небо: сборка программы для венды чем и разрядность ?

В винде MSVC 2015, 32, Qt 5.7.1, пробовал как стоковый с qt-project, так и свой статический, собранный следующим образом:

Код:
configure -static -platform win32-msvc2015 -prefix "C:\Qt\5.7\Static" -release -opensource -confirm-license -nomake examples -nomake tests -nomake tools -opengl desktop -qt-sql-sqlite -make libs -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -openssl-linked OPENSSL_LIBS="-lgdi32 -lssleay32MT -llibeay32MT" -I C:\openssl-1.0.2j-vs2015\include -L C:\openssl-1.0.2j-vs2015\lib

в макос все работает, тестил на 10.11 и 10.12 недавно, Qt 5.6

А вот с Qt 5.7.1 на 10.12 уже не работает, аналогично пробовал собирать как со стоковым, так и со своим Qt, с помощью Clang:

Код:
./configure -prefix /Users/user/Qt/5.7/Static -release -opensource -confirm-license -nomake examples -nomake tests -nomake tools -qt-zlib -qt-libjpeg -static
---------------
Вопрос снимается, разобрался:
Код:
foreach(const QNetworkInterface &iface, QNetworkInterface::allInterfaces()) {
    if (iface.flags().testFlag(QNetworkInterface::IsUp) && !iface.flags().testFlag(QNetworkInterface::IsLoopBack))
    foreach (QNetworkAddressEntry entry, iface.addressEntries()) {
        if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol && entry.ip() != QHostAddress(QHostAddress::LocalHost)) {
            qDebug() << "Interface: " + iface.name();
            qDebug() << "ip: " + entry.ip().toString();
            qDebug() << "netmask: " + entry.netmask().toString();
            qDebug() << "broadcast: " + entry.broadcast().toString();
        }
    }
}
« Последнее редактирование: Январь 17, 2017, 14:12 от posix » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Январь 17, 2017, 16:21 »

на всякий случай свой код выложу (IPv6 адреса тоже собирает):
Код
C++ (Qt)
// get list of computer's IPs
QList<QHostAddress> lanIPs;
for (const auto &interface : QNetworkInterface::allInterfaces())
{
   if (!interface.isValid())
       continue;
 
   auto flags = interface.flags();
   if (!(flags & QNetworkInterface::IsRunning) || !(flags & QNetworkInterface::IsUp) || flags & QNetworkInterface::IsLoopBack || flags & QNetworkInterface::IsPointToPoint)
       continue;
 
   for (const auto &addressEntry : interface.addressEntries())
   {
       auto ip = addressEntry.ip();
       if (!ip.isNull() && !ip.isLoopback() && !ip.isMulticast())
           lanIPs << ip;
   }
}

P.S. нафига нужна статическая сборка в макос?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
posix
Гость
« Ответ #5 : Январь 18, 2017, 11:27 »

нафига нужна статическая сборка в макос?
Объективных причин нет, но мне так спокойнее.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.194 секунд. Запросов: 22.