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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Получить локальный DNS  (Прочитано 3211 раз)
posix
Гость
« : Январь 13, 2017, 21:51 »

Подскажите кроссплатформенный (linux, win, mac) способ получить dns сервера, прописанные по умолчанию на локальной машине.

Заранее благодарен.
Записан
posix
Гость
« Ответ #1 : Январь 14, 2017, 01:44 »

Удалось родить вот такую порнографию:
Код:
#ifndef Q_OS_WIN
    #include <resolv.h>
#else
    #define _WINSOCKAPI_
    #include <winsock2.h>
    #include <iphlpapi.h>
#endif


#ifndef Q_OS_WIN
    res_init();

    struct __res_state res;
    res_ninit( &res );

    int i;

    qDebug() << "DNS: ";

    for( i=0; i < MAXNS && i < res.nscount; i++ ){
        QString dns = QString::number((_res.nsaddr_list[i].sin_addr.s_addr & 0xff) >> 0) + "." +
                      QString::number((_res.nsaddr_list[i].sin_addr.s_addr & 0xff00) >> 8) + "." +
                      QString::number((_res.nsaddr_list[i].sin_addr.s_addr & 0xff0000) >> 16) + "." +
                      QString::number((_res.nsaddr_list[i].sin_addr.s_addr & 0xff000000) >> 24);
       qDebug() << dns;
    }
#else
    FIXED_INFO *pFixedInfo;

    ULONG ulOutBufLen;

    pFixedInfo = (FIXED_INFO *) malloc(sizeof (FIXED_INFO));
    ulOutBufLen = sizeof (FIXED_INFO);

    if (GetNetworkParams(pFixedInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
        free(pFixedInfo);
        pFixedInfo = (FIXED_INFO *) malloc(ulOutBufLen);
        if (pFixedInfo == NULL) {
            qDebug() << "DNS: -";
        }
    }

    if (GetNetworkParams(pFixedInfo, &ulOutBufLen) != NO_ERROR) {
        qDebug() << "DNS: -";
        if (pFixedInfo) {
            free(pFixedInfo);
        }
    }

    qDebug() << "DNS:" << pFixedInfo->DnsServerList.IpAddress.String;

    if (pFixedInfo)
        free(pFixedInfo);
#endif
Неужели в Qt нет нормального способа?

В linux будет то, что в /etc/resolv.conf, то есть в какой-нибудь убунте там будет не то, что нужно.
В windows будет только primary dns.
На mac работает также как и в linux.
« Последнее редактирование: Январь 14, 2017, 09:58 от posix » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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