гетаддринфо противоречивое поведение - PullRequest
1 голос
/ 13 августа 2010

Я использую 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 :: 1, когда присутствует IPv6 и адрес IPv4когда это не так.
За исключением иногда в Windows 2008 R2 (по крайней мере, это единственная система, где я видел это, но я видел это дважды, оба раза в системе клиента), он привязывается к 127.0.0.1 вместоIPv6!
Это приводит меня в замешательство, потому что если вы связываете :: 1, он будет принимать оба соединения с 127.1 и с :: 1, но если вы связываете 127.1, то соединения IPv6 не принимаются.

1 Ответ

3 голосов
/ 13 августа 2010

getaddrinfo() возвращает вам список соответствующих адресов в неуказанном порядке.Вы должны пройти по списку (следуя указателю ai_next) и создать сокет прослушивания, привязанный к каждому возвращенному адресу.

...