【问题标题】:getaddrinfo inconsistent behaviorgetaddrinfo 不一致的行为
【发布时间】:2011-03-29 06:34:57
【问题描述】:

我正在使用 getaddrinfo 启动本地服务器,只接受本地主机上的连接:

struct addrinfo *res;
struct addrinfo hints = {0};
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
getaddrinfo(NULL, portbuf, &hints, &res);

这似乎工作正常,当存在 IPv6 时给我 IPv6 地址 ::1,不存在时给我 IPv4 地址。
除了有时在 Windows 2008 R2 上(至少这是我见过的唯一系统,但我见过两次,两次都是在客户系统上)它绑定到 127.0.0.1 而不是 IPv6!
这让我很困惑,因为如果您绑定 ::1,它将同时接受到 127.1 和 ::1 的连接,但如果您绑定 127.1,则不接受 IPv6 连接。

【问题讨论】:

    标签: c sockets network-programming ipv6 ipv4


    【解决方案1】:

    getaddrinfo() 以未指定的顺序返回匹配地址的列表。您应该遍历列表(跟随ai_next 指针),并创建一个绑定到每个返回地址的侦听套接字。

    【讨论】:

    • 不知道.. 我不相信。我认为只听 IPv6 并依赖 IPv4 也将被接受(在 Windows 2003 之上)这一事实是可以的。当我连接时,我会遍历所有地址,但为什么在接受时要洗澡?我确实意识到我将不得不进行更改,因为我不能依赖 IPv6 地址作为第一个返回的地址。我想了解的是是什么导致它不是第一个。因为我构建的所有系统都首先使用 IPv6,但是该客户构建的所有系统都首先使用 IPv4。配置中一定有东西。
    • @MK:这只是最可靠的方式,仅此而已。如果您宁愿只听一个地址,您可以遍历列表,直到找到最好的一个(如果有的话,大概是AF_INET6 地址)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2011-03-19
    • 2012-05-15
    • 2014-11-11
    • 2013-08-21
    相关资源
    最近更新 更多