Удалось родить вот такую порнографию:
#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.