API сокетов управляется RFC-сетями IETF и должен быть одинаковым на всех платформах, включая Windows WRT IPv6.
Для приложений IPv4/IPv6 это ВСЕ около getaddrinfo()
и getnameinfo()
. getaddrinfo
- гений - смотрит на DNS, имена портов и возможности клиента, чтобы решить вечный вопрос: «Могу ли я использовать IPv4, IPv6 или оба для достижения определенного адресата?» Или, если вы идете по маршруту двойного стека и хотите, чтобы он возвращал IPv4-адресам IPv4, и он тоже это сделает.
Это обеспечивает прямую sockaddr *
структуру, которая может быть подключена к bind()
, recvfrom()
, sendto()
и семейству адресов для socket()
... Во многих случаях это не означает, что не грязный sockaddr_in(6)
структуры, чтобы заполнить и иметь дело.
Для реализации UDP я был бы осторожен в настройке сокетов двойного стека или, в более общем плане, привязке ко всем интерфейсам (INADDR_ANY
). Классическая проблема заключается в том, что когда адреса не блокируются (см. bind()
) для конкретных интерфейсов, и система имеет несколько запросов на интерфейсы, ответы могут проходить с разных адресов для компьютеров с несколькими адресами на основе прихотей таблицы маршрутизации ОС, запутывающего приложения протоколов, особенно любых систем с требованиями аутентификации.
Для реализации UDP, где это не проблема, или TCP, двойные стековые сокеты могут сэкономить много времени, когда IPv * -изменяет вашу систему. Нужно быть осторожным, чтобы не полагаться полностью на двойной стек, где это не совсем необходимо, поскольку нет недостатка в разумных платформах (Old Linux, BSD, Windows 2003), развернутых со стеками IPv6, не способными к двойным сокетам сокета.
Спасибо за информацию, именно то, что я искал. – Charles
Сказать, что IPV6_V6ONLY отключен по умолчанию в Linux, неверен: он зависит от операционной системы, а не только от ядра. Например, в Debian GNU/Linux он по умолчанию включен. – bortzmeyer
OS X также имеет его по умолчанию, но лучше всего всегда устанавливать его явно. Возможно, локальный системный администратор изменил его. –