Interfejs API gniazda jest zarządzany przez specyfikacje RFC IETF i powinien być taki sam na wszystkich platformach, w tym w systemie Windows WRT IPv6.
Dla aplikacji IPv4/IPv6 jest to ALL około getaddrinfo()
i getnameinfo()
. getaddrinfo
jest geniuszem - sprawdza DNS, nazwy portów i możliwości klienta, aby rozwiązać odwieczne pytanie "czy mogę używać IPv4, IPv6 lub obu, aby dotrzeć do określonego miejsca docelowego?" Lub jeśli wybierasz trasę z dwoma stosami i chce, aby zwrócił adresy IPv6 odwzorowane w IPv4, to też to zrobi.
Zapewnia bezpośredni sockaddr *
struktury, które mogą być podłączone do bind()
, recvfrom()
, sendto()
i rodziny adresów dla socket()
... W wielu przypadkach oznacza to nie bałagan sockaddr_in(6)
struktur wypełnić i czynienia.
Dla implementacji UDP byłbym ostrożny przy ustawianiu gniazd z dwoma stosami lub, bardziej ogólnie, dla wszystkich interfejsów (INADDR_ANY
). Klasyczny problem polega na tym, że gdy adresy nie są zablokowane (patrz bind()
) dla konkretnych interfejsów, a system ma wiele żądań interfejsów, odpowiedzi mogą być przesyłane z różnych adresów dla komputerów z wieloma adresami w oparciu o kaprysy tabeli routingu systemu operacyjnego, mylące zastosowanie protokoły - w szczególności wszelkie systemy z wymogami uwierzytelniania.
W przypadku implementacji UDP, w których nie występuje problem, lub w przypadku protokołu TCP, gniazda z dwoma stosami mogą zaoszczędzić dużo czasu, gdy IPv * włącza system. Trzeba być ostrożnym, aby nie polegać wyłącznie na dual-stacku, gdzie nie jest to absolutnie konieczne, ponieważ nie ma niedoborów rozsądnych platform (Old Linux, BSD, Windows 2003) wdrożonych ze stosami IPv6, które nie są w stanie obsługiwać podwójnych stosów.
Dzięki za te informacje, dokładnie to, czego szukałem. – Charles
Powiedzenie, że IPV6_V6ONLY jest domyślnie wyłączone w systemie Linux, jest nieprawidłowe: zależy to od systemu operacyjnego, a nie tylko od jądra. Na przykład w systemie Debian GNU/Linux domyślnie została domyślnie włączona. – bortzmeyer
System operacyjny również domyślnie go wyłącza, ale najlepiej jest zawsze ustawić go jawnie. Lokalny sysadmin mógł mimo wszystko go zmienić. –