【问题标题】:Need to understand the structure returned by getaddrinfo()需要了解getaddrinfo()返回的结构
【发布时间】:2015-07-22 10:30:18
【问题描述】:

我正在尝试构建一个与 IP 版本无关的简单网络服务器。

这是我的示例代码 sn-p

hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6 to force version
hints.ai_flags = AI_PASSIVE;     // fill in my IP for me
hints.ai_socktype = SOCK_STREAM;




if ((status = getaddrinfo(NULL, "8000", &hints, &res)) != 0){
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
    exit(0);
}   

填充状态后,我遍历链表“res”的每个元素,直到找到有效条目,然后使用该结构初始化套接字。

我的问题是,在 getaddrinfo() 返回的链接列表“res”中,我是否获得了 IPv4 和 IPv6 环回地址的单独结构?在这种情况下,我是否需要创建两个套接字来分别监听和服务 IPv4 和 IPv6 环回地址?或者“res”链表中是否有一个结构可以用来创建一个“神奇地”监听两个 IPv4/v6 环回地址的套接字?

谢谢

【问题讨论】:

  • 你不需要监听所有的接口。你可以用一个socket来完成。

标签: c sockets ip getaddrinfo


【解决方案1】:

我的问题是,在 getaddrinfo() 返回的链接列表“res”中,我是否获得了 IPv4 和 IPv6 环回地址的单独结构?

您将获得 IPv4(家族 AF_INET)和 IPv6(家族 AF_INET6)地址的单独结果。但是,使用您的特定参数,您不应该得到带有环回地址的结果,因为您已经指定了 no 节点并给出了 AI_PASSIVE 提示。返回的每个结构都应该代表一个通配符地址。

在这种情况下,我是否需要创建两个套接字来分别监听和服务 IPv4 和 IPv6 环回地址?

不,您不应该需要多个套接字。您只能在运行双栈的机器上同时获得 IPv4 和 IPv6 地址。如果你想从这样的机器上同时为 IPv4 和 IPv6 客户端提供服务(你应该这样做),那么一定要选择一个 IPv6 地址。这应该适用于使用任一协议的客户端。

或者“res”链表中是否有一个结构可以用来创建一个套接字,该套接字“神奇地”监听两个 IPv4/v6 环回地址?

其中涉及到一些魔法,但它是在网络和协议级别。 IPv6 的设计预期有一个重要的过渡期,因此它对与 IPv4 的互操作性有很好的规定。

【讨论】:

  • 感谢您的详细回复。当我浏览返回的链表时,我确实得到了 ipv4 环回地址的结构(我停在链表中的第一个有效结构处),我可以绑定到它并使用 ipv4 地址 127.0 将网页传送到我的浏览器。 0.1。我想要做的是创建一个网络服务器,我可以使用 ipv4 127.0.0.1 或 ipv6 [::1] 环回地址访问它(这就是我认为与 ip 无关的意思)。我试过运行一个独立的 ipv6 服务器,它可以工作。所以我相信我的网络接口同时支持 IP 堆栈
  • 看来我的理解不够。我现在明白,如果我使用 ipv6 in6addr_any,我的服务器将同时使用 v4 和 v6 环回地址。
  • 是的,这就是我想说的。如果您的网络和接口同时支持这两种协议,则让服务器侦听 IPv6 地址。也将提供到达该接口的 IPv4 流量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
相关资源
最近更新 更多