1

我正在使用 getaddrinfo 启动本地服务器,仅在 localhost 上接受连接:

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

4

1 回答 1

3

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

于 2010-08-13T04:23:59.047 回答