getaddrinfo i getnameinfo są Twoimi przyjaciółmi. W miarę możliwości sugeruję, aby byli twoimi najlepszymi przyjaciółmi w dążeniu do zapewnienia obsługi IPv4 i IPv6 w istniejącej aplikacji.
Jeśli zrobisz to dobrze, dodając obsługę IPv6, skończysz także abstrakcję systemu do punktu, w którym nieznany przyszły protokół IP może działać bez modyfikacji kodu.
Zwykle podczas łączenia byś wypełnić strukturę gniazdo, port rodziny adresów, adres IP, adres/konwersji porty do sieci kolejność bajtów itp
Z getaddrinfo
wyślesz adres IP lub nazwę hosta i port lub nazwa portu, i zwraca połączoną listę ze strukturami i wszystkim gotowym do przekazania bezpośrednio do socket()
i connect()
.
getaddrinfo
ma kluczowe znaczenie dla pracy z obu protokołów IP, ponieważ nie wie, czy gospodarz ma łączność IPv6 i IPv4 i wie, jeśli peer ma także patrząc na DNS AAAA
vs A
ewidencji i dynamicznie dane, który protokół (s) są dostępne do obsługi konkretnego żądania połączenia.
Odradzam korzystanie z inet_pton()
, inet_addr()
lub urządzeń, które są specyficzne dla wersji IP. Na platformie Windows konkretnie inet_pton()
nie jest kompatybilny z wcześniejszymi wersjami MS Windows (XP, 2003 i inni), chyba że użyjesz własnego. Odradzaj także oddzielne wersje dla IPv4 i IPv6 ... Nie jest to możliwe, ponieważ jest to rozwiązanie techniczne, ponieważ w niedalekiej przyszłości oba protokoły będą musiały być używane równocześnie, a ludzie mogą nie wiedzieć z wyprzedzeniem, z których korzystać. Interfejsy gniazd są abstrakcyjne i łatwo jest wykryć obsługę podwójnego stanowiska lub IPv6, próbując utworzyć gniazdo IPv6 lub spróbować ustawić opcję gniazda dualstack IPv6 dla odbiorców. Nie ma powodu, aby powstała aplikacja nie działała w systemie, który nie obsługuje lub nie zna protokołu IPv6.
Dla połączeń wychodzących użyj PF_UNSPEC
w getaddrinfo
, aby rodzina adresów została wybrana podczas nawiązywania połączeń wychodzących. To, IMHO, jest lepsze niż podejście dualstack, ponieważ pozwala platformom, które nie obsługują dualstack do pracy.
W przypadku połączeń przychodzących można połączyć osobno gniazda IPv4/IPv6, jeśli jest to uzasadnione ze względu na projekt lub użycie dualstack, jeśli nie można wykonać osobnych programów nasłuchujących. Podczas korzystania z dualstack getnameinfo
zwraca adres IPv6 dla adresów IPv4, które IMHO kończy się całkowicie bezużyteczne. Mały program narzędziowy może przekonwertować ciąg na normalny adres IPv4.
Z mojego doświadczenia wynika, że po usunięciu zależności od określonych wersji IP zakończyło się to mniejszym kodem zarządzania gniazdem, niż to się zaczęło.
Warto również zauważyć, że wszystkie te połączenia są na ogół przenośne między Windows, Mac OS X i Linux, z niewielkimi różnicami tu i tam. –