IPv6 支持
为了在具有 Service Pack 1 的 Windows XP (SP1) 和 Windows Server 2003 上同时支持 IPv4 和 IPv6,应用程序必须创建两个套接字,一个套接字用于 IPv4,另一个套接字用于 IPv6。 应用程序必须单独处理这两个套接字。
如果具有 SP1 和 Windows Server 2003 的 Windows XP 上的 TCP/IP 服务提供商支持 IPv4 和 IPv6 寻址,则必须创建两个单独的套接字并单独侦听这些套接字:
- 一次用于 IPv4。
- 一次用于 IPv6 地址系列。
Windows Vista 和更高版本提供创建单个 IPv6 套接字的功能,该套接字可以处理 IPv6 和 IPv4 流量。 例如,创建 IPv6 的 TCP 侦听套接字,将其置于双堆栈模式,并绑定到端口 5001。 此双堆栈套接字可以接受从连接到端口 5001 的 IPv6 TCP 客户端和从连接到端口 5001 的 IPv4 TCP 客户端的连接。 此功能可大大简化应用程序设计,并减少在两个单独的套接字上发布操作所需的资源开销。 但是,若要使用双堆栈套接字,必须满足一些限制。 有关详细信息,请参阅 双堆栈套接字。
WSAEnumProtocols 为每个受支持的套接字类型返回两个 WSAPROTOCOL_INFO 结构, (SOCK_STREAM SOCK_DGRAM SOCK_RAW) 。 对于 IPv4 寻址, iAddressFamily 必须设置为 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 套接字 1.1 函数,并且想要使用 IPv6 地址,它可以继续使用所有旧函数,这些函数将 sockaddr 结构作为参数之一 (绑定、 连接、 sendto、 recvfrom、 accept 等) 。 唯一需要的更改是使用 sockaddr_in6 而不是 sockaddr_in。
但是,名称解析函数 (gethostbyname、 gethostbyaddr 等) 和地址转换函数 (inet_addr, inet_ntoa) 不能重复使用,因为它们假定 IP 地址的长度为 4 个字节。 想要对 IPv6 地址执行名称解析和地址转换的应用程序必须使用 Windows 套接字 2 特定的函数。 引入了许多新函数,使 Windows 套接字 2 应用程序能够利用 IPv6,包括 getaddrinfo 和 getnameinfo 函数。
有关如何在应用程序中启用 IPv6 功能的详细信息,请参阅 适用于 Windows 套接字应用程序的 IPv6 指南。