Я использую 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 не принимаются.