首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么getnameinfo()检索重复地址?

为什么getnameinfo()检索重复地址?
EN

Stack Overflow用户
提问于 2020-06-07 22:18:03
回答 1查看 104关注 0票数 1

我使用来自BSD套接字API的getnameinfo()函数从主机获取地址,我希望获得所有可用的地址:

代码语言:javascript
复制
 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);

然后构建和运行这段代码,我得到了输出:

代码语言:javascript
复制
$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地址都打印两三次?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-07 23:05:39

您正在看到一个过于未指定的hints变量的效果,它通常会将列表缩小到所要求的范围。

当您询问所有内容时,似乎每个IP地址都有一个条目tcp (SOCK_STREAM)、udp (SOCK_DGRAM)加上IP (SOCK_RAW),但是如果只是查找IP地址--而不是服务--我不认为这有什么用处。

解决这个问题的简单方法是更新提示:

代码语言:javascript
复制
    struct addrinfo hints;
    memset(&hints, 0, sizeof hints);
    hints.ai_flags = AI_ALL;
    hints.ai_socktype = SOCK_RAW;   // ADD ME

另外,循环确实跳过了第一个条目,因此另一个选项可能是:

代码语言:javascript
复制
    for (struct addrinfo *address = peer_address
       ;  address != 0
       ;  address = address->ai_next )
    {
        // do stuff

有帮助的参考资料:What's the "hints" mean for the addrinfo name in socket programming

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62252397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档