首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从getaddrinfo获取奇怪的地址

从getaddrinfo获取奇怪的地址
EN

Stack Overflow用户
提问于 2016-09-17 02:01:49
回答 1查看 364关注 0票数 1

我写了下面的测试程序,我不能理解我得到的输出:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>

int main(int argc, char** argv) {
  struct addrinfo* results;
  struct addrinfo hints;
  char buf[INET6_ADDRSTRLEN+1];

  if (argc != 2) {
    exit(-1);
  }

  memset((char*) &hints, 0, sizeof(struct addrinfo));
  hints.ai_family = AF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  hints.ai_flags = AI_PASSIVE;

  int ret = getaddrinfo(NULL, argv[1], &hints, &results);
  if (ret) {
    fprintf(stderr, "%s\n", gai_strerror(ret));
    exit(-1);
  }

  for (struct addrinfo* ai = results; ai != NULL; ai = ai->ai_next) {
    if (ai->ai_family == AF_INET) {
      inet_ntop(AF_INET, ai, buf, INET_ADDRSTRLEN);
    } else {
      inet_ntop(AF_INET6, ai, buf, INET6_ADDRSTRLEN);
    }
    printf("%s\n", buf);
  }

  freeaddrinfo(results);
  return 0;
}

在我的Fedora 23机器上,将打印以下内容:

代码语言:javascript
运行
复制
1.0.0.0
100:0:a00:0:100:0:600:0

我的理解是,返回的IP地址应该是INADDR_ANYIN6ADDR_ANY_INIT,这两个地址的值都应该是0,即预期输出应该是0.0.0.0::0。有人能给我解释一下这是怎么回事吗?

另一个相关的问题是,如果我的一个接口有一个host.domain.dom解析到的IP,而我事先不确定该域是否有IPv6地址,我如何才能获得sockaddr结构,以便我可以用来侦听该域的IPv4和IPv6地址,而不绑定到任何其他IP?即使在这种情况下忽略了AI_PASSIVE标志,也向getaddrinfo提供该主机名是否正确?

EN

回答 1

Stack Overflow用户

发布于 2016-09-17 06:38:37

您不应该将ai本身作为参数提供给inet_ntop;您应该提供指向实际网络地址的指针,而不是指向addrinfo结构的指针。inet_ntop()需要in_addrin6_addr结构,因此根据ai->ai_familyai->ai_addr类型转换为sockaddr_in*sockaddr_in6*,然后分别传递其sin_addrsin6_addr字段的地址。

代码语言:javascript
运行
复制
if (ai->ai_family == AF_INET) {
    inet_ntop(AF_INET, &(((sockaddr_in*)(ai->ai_addr))->sin_addr), buf, INET_ADDRSTRLEN);
} else {
    inet_ntop(AF_INET6, &(((sockaddr_in6*)(ai->ai_addr))->sin6_addr), buf, INET6_ADDRSTRLEN);
}

关于你的第二个问题,我相信这将会回答它:

How to choose a server socket address using getaddrinfo?

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

https://stackoverflow.com/questions/39537589

复制
相关文章

相似问题

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