Это может зависеть от вашей платформы, но в Linux начиная с 2.4 структура sockaddr_in6
также содержит член sin6_scope_id
для определения области IPv6, а поскольку переменная hint
находится в стеке, она получает случайные данные вit.
Область IPv6 описывает, какой это тип адреса: одноадресная, многоадресная, локальная ссылка и некоторые другие, и я знаю их только за рулем. Но если там есть мусор, это может быть чем-то особенным.
Рекомендовать исключить это как проблему, либо жестко установив sin6_scope_id
на ноль, либо (лучше) просто обнулить всю структуру sockaddr_in6
перед тем, как присвоить ему материал;Я давно делал это с моими sockaddr_in
переменными, просто чтобы быть уверенным, что я не закончил ненужным мусором.
memset(&hint, 0, sizeof hint);
И да, errno
действительно важен.