Russian Qt Forum

Qt => Работа с сетью => Тема начата: posix от Январь 13, 2017, 21:51



Название: Получить локальный DNS
Отправлено: posix от Январь 13, 2017, 21:51
Подскажите кроссплатформенный (linux, win, mac) способ получить dns сервера, прописанные по умолчанию на локальной машине.

Заранее благодарен.


Название: Re: Получить локальный DNS
Отправлено: posix от Январь 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.