IPv6 のサポート
Service Pack 1 (SP1) と Windows Server 2003 で Windows XP で IPv4 と IPv6 の両方をサポートするには、アプリケーションで 2 つのソケット (IPv4 で使用するソケットと IPv6 で使用するソケット) を作成する必要があります。 これら 2 つのソケットは、アプリケーションによって個別に処理される必要があります。
SP1 と Windows Server 2003 の Windows XP の TCP/IP サービス プロバイダーが IPv4 と IPv6 のアドレス指定をサポートしている場合は、2 つの個別のソケットを作成し、これらのソケットで個別にリッスンする必要があります。
- IPv4 の場合は 1 回。
- IPv6 アドレス ファミリに対して 1 回。
Windows Vista 以降では、IPv6 と IPv4 の両方のトラフィックを処理できる単一の IPv6 ソケットを作成できます。 たとえば、IPv6 用の TCP リッスン ソケットが作成され、デュアル スタック モードになり、ポート 5001 にバインドされます。 このデュアル スタック ソケットは、ポート 5001 に接続している IPv6 TCP クライアントと、ポート 5001 に接続している IPv4 TCP クライアントからの接続を受け入れます。 この機能により、アプリケーション設計が大幅に簡素化され、2 つの別々のソケットに操作をポストするために必要なリソース オーバーヘッドが削減されます。 ただし、デュアルスタック ソケットを使用するには、いくつかの制限を満たす必要があります。 詳細については、「 デュアルスタック ソケット」を参照してください。
WSAEnumProtocols は、サポートされているソケットの種類 ( SOCK_STREAM、SOCK_DGRAM 、SOCK_RAW) ごとに 2 つのWSAPROTOCOL_INFO構造体を返します。 iAddressFamily は、IPv4 アドレス指定の場合は AF_INET に、IPv6 アドレス指定の場合は AF_INET6 に設定する必要があります。
IPv6 アドレスについては、次の構造で説明します。
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 */
};
アプリケーションで Windows Sockets 1.1 関数を使用し、IPv6 アドレスを使用する場合は、 sockaddr 構造体をパラメーターの 1 つとして受け取るすべての古い関数 (バインド、 接続、 sendto、 recvfrom、 accept など) を引き続き使用できます。 必要な唯一の変更は、 sockaddr_inではなくsockaddr_in6 を使用 することです。
ただし、名前解決関数 (gethostbyname、 gethostbyaddr など) とアドレス変換関数 (inet_addr、 inet_ntoa) は、IP アドレスの長さが 4 バイトであることを前提としているため、再利用できません。 IPv6 アドレスの名前解決とアドレス変換を実行するアプリケーションでは、Windows ソケット 2 固有の関数を使用する必要があります。 Windows Sockets 2 アプリケーションが getaddrinfo 関数や getnameinfo 関数を含む IPv6 を利用できるようにするために、多くの新しい関数が導入されました。
アプリケーションで IPv6 機能を有効にする方法の詳細については、「 Windows ソケット アプリケーションの IPv6 ガイド」を参照してください。