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


Поддержка 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. Этот сокет с двумя стеками может принимать подключения от клиентов IPv6 TCP, подключающихся к порту 5001, и от клиентов TCP IPv4, подключающихся к порту 5001. Эта функция позволяет значительно упростить структуру приложения и сократить затраты на ресурсы, необходимые для размещения операций в двух отдельных сокетах. Однако для использования сокета с двумя стеками необходимо соблюдать некоторые ограничения. Дополнительные сведения см. в разделе Сокеты с двумя стеками.

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