Поделиться через


Поддержка IPv6

Для поддержки IPv4 и IPv6 в Windows XP с пакетом обновления 1 (SP1) и в Windows Server 2003 приложение должен создать два сокета, один сокет для использования с IPv4 и один сокет для использования с IPv6. Эти два сокета должны обрабатываться отдельно приложением.

Если поставщик служб TCP/IP в Windows XP с пакетом обновления 1 (SP1) и Windows Server 2003 поддерживает адресацию IPv4 и IPv6, он должен создавать два отдельных сокета и прослушивать отдельно на этих сокетах:

  • Один раз для IPv4.
  • Один раз для семейства адресов IPv6.

Windows Vista и более поздних версий предлагают возможность создать один сокет IPv6, который может обрабатывать трафик IPv6 и IPv4. Например, создается сокет прослушивания TCP для IPv6, помещается в режим двойного стека и привязан к порту 5001. Этот сокет с двойным стеком может принимать подключения от клиентов TCP IPv6, подключающихся к порту 5001 и от клиентов TCP IPv4, подключающихся к порту 5001. Эта функция позволяет значительно упростить проектирование приложения и сократить затраты на ресурсы, необходимые для размещения операций на двух отдельных сокетах. Однако существуют некоторые ограничения, которые необходимо выполнить для использования сокета с двумя стеками. Дополнительные сведения см. в разделе Dual-Stack Сокеты.

WSAEnumProtocols возвращает две структуры WSAPROTOCOL_INFO для каждого из поддерживаемых типов сокетов (SOCK_STREAM, SOCK_DGRAM, SOCK_RAW). iAddressFamily необходимо задать для AF_INET для адресации IPv4 и AF_INET6 для IPv6-адресов.

Адреса 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 1.1 и хочет использовать IPv6-адреса, оно может продолжать использовать все старые функции, которые принимают структуру sockaddr в качестве одного из параметров (привязки, подключиться, sendtoи recvfrom, принятьи т. д.). Единственное необходимое изменение — использовать sockaddr_in6 вместо sockaddr_in.

Однако функции разрешения имен (gethostbyname, gethostbyaddrи т. д.) и функции преобразования адресов (inet_addr, inet_ntoa) нельзя повторно использовать, так как они предполагают, что IP-адрес составляет 4 байта. Приложение, которое хочет выполнить разрешение имен и преобразование адресов для IPv6-адресов, должно использовать функции Windows Sockets 2. Появились многие новые функции, позволяющие приложениям Windows Sockets 2 воспользоваться преимуществами IPv6, включая функции getaddrinfo и getnameinfo.

Дополнительные сведения о включении возможностей IPv6 в приложении см. в руководстве IPv6 для приложений сокетов Windows.