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 结构作为参数之一 (绑定连接sendtorecvfromaccept 等) 。 唯一需要的更改是使用 sockaddr_in6 而不是 sockaddr_in

但是,名称解析函数 (gethostbynamegethostbyaddr 等) 和地址转换函数 (inet_addrinet_ntoa) 不能重复使用,因为它们假定 IP 地址的长度为 4 个字节。 想要对 IPv6 地址执行名称解析和地址转换的应用程序必须使用 Windows 套接字 2 特定的函数。 引入了许多新函数,使 Windows 套接字 2 应用程序能够利用 IPv6,包括 getaddrinfogetnameinfo 函数。

有关如何在应用程序中启用 IPv6 功能的详细信息,请参阅 适用于 Windows 套接字应用程序的 IPv6 指南