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