次の方法で共有


IPv6 のサポート

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 を使用することです。

ただし、名前解決関数 (gethostbynamegethostbyaddrなど) とアドレス変換関数 (inet_addrinet_ntoa) は、IP アドレスの長さが 4 バイトであることを前提としているため、再利用できません。 IPv6 アドレスの名前解決とアドレス変換を実行するアプリケーションでは、Windows ソケット 2 固有の関数を使用する必要があります。 getaddrinfoや getnameinfo 関数など、Windows Sockets 2 アプリケーションが IPv6 を利用できるようにするために、多くの新しい関数が導入されました。

アプリケーションで IPv6 機能を有効にする方法の詳細については、「IPv6 Guide for Windows Sockets Applications」を参照してください。