【发布时间】:2020-06-07 22:18:03
【问题描述】:
我正在使用 BSD 套接字 API 中的 getnameinfo() 函数从主机获取地址,我想获取所有可用的地址:
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_ALL;
struct addrinfo *peer_address;
if (getaddrinfo(argv[1], NULL, &hints, &peer_address)) {
fprintf(stderr, "getaddrinfo() ERROR.\n");
return EXIT_FAILURE;
}
printf("Remote address(es):\n");
struct addrinfo *address = peer_address;
while((address = address->ai_next)) {
char address_buffer[100];
getnameinfo(address->ai_addr, address->ai_addrlen,
address_buffer, sizeof(address_buffer), 0, 0, NI_NUMERICHOST);
printf("\t> %s\n", address_buffer);
}
freeaddrinfo(peer_address);
构建并运行这段代码,我得到了输出:
$lookup google.com
Remote address(es):
> 172.217.203.100
> 172.217.203.100
> 172.217.203.102
> 172.217.203.102
> 172.217.203.102
.
.
.
> 2607:f8b0:400c:c07::8a
> 2607:f8b0:400c:c07::8a
> 2607:f8b0:400c:c07::8a
为什么每个 IP 地址都要打印两三次?
【问题讨论】:
-
它没有检查
getnameinfo()的结果,所以有些可能会失败,留下前一个条目的值。另外,这不是跳过列表中的 first 条目吗? -
getnameinfo()很好,返回0,没有问题,但是谢谢,我必须记住检查每个函数的返回值。
标签: c sockets networking