Udostępnij przez


Obsługa protokołu IPv6

Aby obsługiwać zarówno protokoły IPv4, jak i IPv6 w systemie Windows XP z dodatkiem Service Pack 1 (SP1) i w systemie Windows Server 2003, aplikacja musi utworzyć dwa gniazda, jedno gniazdo do użycia z protokołem IPv4 i jedno gniazdo do użycia z protokołem IPv6. Te dwa gniazda muszą być obsługiwane oddzielnie przez aplikację.

Jeśli dostawca usług TCP/IP w systemie Windows XP z dodatkiem SP1 i w systemie Windows Server 2003 obsługuje adresowanie IPv4 i IPv6, musi utworzyć dwa oddzielne gniazda i nasłuchiwać oddzielnie na tych gniazdach:

  • Raz dla protokołu IPv4.
  • Raz dla rodziny adresów IPv6.

System Windows Vista i nowsze oferują możliwość utworzenia pojedynczego gniazda IPv6, które może obsługiwać ruch IPv6 i IPv4. Na przykład jest tworzone gniazdo nasłuchiwania TCP dla protokołu IPv6, umieszczane w trybie podwójnego stosu i powiązane z portem 5001. To gniazdo z dwoma stosami może akceptować połączenia od klientów TCP IPv6 łączących się z portem 5001 i z klientów PROTOKOŁU IPv4 łączących się z portem 5001. Ta funkcja umożliwia znacznie uproszczone projektowanie aplikacji i zmniejsza nakład pracy związany z zasobami wymaganymi do delegowania operacji na dwóch oddzielnych gniazdach. Istnieją jednak pewne ograniczenia, które należy spełnić, aby można było użyć gniazda dwustosowego. Aby uzyskać więcej informacji, zobacz Dual-Stack Sockets.

WSAEnumProtocols zwraca dwie struktury WSAPROTOCOL_INFO dla każdego z obsługiwanych typów gniazd (SOCK_STREAM, SOCK_DGRAM, SOCK_RAW). iAddressFamily musi być ustawiona na AF_INET adresowania IPv4 i AF_INET6 adresowania IPv6.

Adresy IPv6 są opisane w poniższych strukturach.

struct in_addr6 {
    u_char    s6_addr[16];             /* IPv6 address */
};

struct sockaddr_in6 {
    short             sin6_family;     /* AF_INET6 */
    u_short           sin6_port;       /* Transport level port number */
    u_long            sin6_flowinfo;   /* IPv6 flow information */
    struct in_addr6   sin6_addr;       /* IPv6 address */
    u_long            sin6_scope_id;   /* set of interfaces for a scope */
   };

Jeśli aplikacja używa funkcji Windows Sockets 1.1 i chce używać adresów IPv6, może nadal używać wszystkich starych funkcji, które przyjmują strukturę sockaddr sockaddr jako jeden z parametrów (powiązać, połączyć, sendtoi odzyskiwania z, zaakceptowaćitd.). Jedyną wymaganą zmianą jest użycie sockaddr_in6 zamiast sockaddr_in.

Jednak funkcje rozpoznawania nazw (gethostbyname, gethostbyaddri tak dalej) i funkcje konwersji adresów (inet_addr, inet_ntoa) nie mogą być ponownie używane, ponieważ zakładają, że adres IP ma długość 4 bajtów. Aplikacja, która chce wykonać rozpoznawanie nazw i konwersję adresów dla adresów IPv6, musi używać funkcji specyficznych dla gniazd systemu Windows 2. Wprowadzono wiele nowych funkcji, aby umożliwić aplikacjom Windows Sockets 2 korzystanie z protokołu IPv6, w tym getaddrinfo i funkcji getnameinfo.

Aby uzyskać więcej informacji na temat włączania funkcji IPv6 w aplikacji, zobacz przewodnik IPv6 dla aplikacji Windows Sockets.