我正在尝试将NoIP主机名解析为IP地址,以便连接到它。下面是我当前使用的代码,但e->h_name
只是返回我提供给它的主机名字符串,因此它不起作用。在Python中,gethostbyname
函数成功地完成了这项工作,所以我很困惑为什么它不能在C++中工作。
void ResolveServerDNS(char* hostname) {
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
hostent* e = gethostbyname(hostname);
std::cout << e->h_name << 'n';
}
要获取IP地址,您需要使用以下内容:
printf("%sn", inet_ntoa(*(struct in_addr *)host->h_addr_list[0]));
这是来自的hostent
结构https://learn.microsoft.com/en-us/windows/win32/api/winsock/ns-winsock-hostent
typedef struct hostent {
char *h_name;
char **h_aliases;
short h_addrtype;
short h_length;
char **h_addr_list;
} HOSTENT, *PHOSTENT, *LPHOSTENT;
在你的功能中,它应该是:
hostent *e = gethostbyname(hostname);
std::cout << inet_ntoa(*(struct in_addr *)e->h_addr_list[0]) << 'n';
让我们使用以下代码进行测试:https://godbolt.org/z/zbTx7x3M7
注意:以上是gethostbyname()
返回ok->如果CCD_ 5为空&也许DNS为一个域返回更多的IP->让我们使用for
循环来获取所有IP:
hostent *e = gethostbyname(hostname);
for (int i = 0; e->h_addr_list[i] != NULL; i++) {
std::cout << inet_ntoa(*(struct in_addr *)e->h_addr_list[i]) << 'n';
}