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