Поддержка 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.