IPPROTO_IPV6 套接字选项

下表描述了适用于为 IPv6 地址系列 (AF_INET6) 创建的套接字的IPPROTO_IPV6套接字选项。 有关获取和设置套接字选项的详细信息,请参阅 getsockoptsetsockopt 函数参考页。

若要枚举协议并发现每个已安装协议支持的属性,请使用 WSAEnumProtocolsWSCEnumProtocolsWSCEnumProtocols32 函数。

某些套接字选项需要比这些表所能传达的更多解释;此类选项包含指向其他信息的链接。

选项

选项 get 设置 Optval 类型 说明
IP_ORIGINAL_ARRIVAL_IF DWORD (布尔) 指示 LPFN_WSARECVMSG (WSARecvMsg) 函数是否应返回可选控制数据,其中包含为数据报套接字接收数据包的原始到达接口。 此选项与 IPv6 转换技术 (6to4、ISATAP 和 Teredo 隧道结合使用,例如,当 IPv6 主机必须遍历 IP4 网络才能访问其他 IPv6 网络时,为单播 IPv6 流量提供地址分配和主机到主机自动隧道的) 。 IPv6 数据包将隧道作为 IPv4 数据包发送。 此选项允许在 WSAMSG 结构中返回接收数据包的原始 IPv4 接口。
IPV6_ADD_IFLIST DWORD (IF_INDEX) 将接口索引添加到与 IP_IFLIST 选项关联的 IFLIST。
IPV6_ADD_MEMBERSHIP ipv6_mreq 将套接字加入指定接口上提供的多播组。 此选项仅在数据报和原始套接字上有效, (套接字类型必须是SOCK_DGRAM或SOCK_RAW) 。
IPV6_DEL_IFLIST DWORD (IF_INDEX) 从与 IP_IFLIST 选项关联的 IFLIST 中删除接口索引。 条目只能由应用程序删除,因此请注意,一旦删除接口,条目可能会过时。
IPV6_DROP_MEMBERSHIP ipv6_mreq 从给定接口保留提供的多播组。 此选项仅在数据报和原始套接字上有效, (套接字类型必须是SOCK_DGRAM或SOCK_RAW) 。
IPV6_GET_IFLIST DWORD[] (IF_INDEX[]) 获取与 IP_IFLIST 选项关联的当前 IFLIST。 如果未启用 IP_IFLIST ,则返回错误。
IPV6_HDRINCL DWORD (布尔) 指示应用程序为所有传出数据提供 IPv6 标头。 如果在调用 setsockopt 时将 optval 参数设置为 1,则启用 选项。 如果 optval 设置为 0,则禁用该选项。 默认值为“已禁用”。 此选项仅对数据报和原始套接字有效, (套接字类型必须是SOCK_DGRAM或SOCK_RAW) 。 支持SOCK_RAW的 TCP/IP 服务提供商还应支持IPV6_HDRINCL。
IPV6_HOPLIMIT DWORD (布尔) 指示应在 LPFN_WSARECVMSG (WSARecvMsg ) 函数中返回跃点 (TTL) 信息。 如果在调用 setsockopt 时将 optval 设置为 1,则启用选项。 如果设置为 0,则禁用选项。 此选项仅对数据报和原始套接字有效, (套接字类型必须是SOCK_DGRAM或SOCK_RAW) 。
IPV6_IFLIST DWORD (布尔) 获取或设置 套接字IP_IFLIST 状态。 如果此选项设置为 true,则数据报接收仅限于 IFLIST 中的接口。 忽略在任何其他接口上收到的数据报。 IFLIST 开始为空。 使用 IP_ADD_IFLISTIP_DEL_IFLIST 编辑 IFLIST。
IPV6_JOIN_GROUP ipv6_mreq 与 IPV6_ADD_MEMBERSHIP 相同
IPV6_LEAVE_GROUP ipv6_mreq 与 IPV6_DROP_MEMBERSHIP 相同
IPV6_MTU DWORD 获取系统对路径 MTU 的估计值。 套接字必须已连接。
IPV6_MTU_DISCOVER DWORD (PMTUD_STATE) 获取或设置套接字的路径 MTU 发现状态。 默认值为 IP_PMTUDISC_NOT_SET。 对于流套接字, IP_PMTUDISC_NOT_SETIP_PMTUDISC_DO 将执行路径 MTU 发现。 IP_PMTUDISC_DONTIP_PMTUDISC_PROBE 将关闭路径 MTU 发现。 对于数据报套接字,如果设置为 IP_PMTUDISC_DO ,则尝试发送大于路径 MTU 的数据包将导致错误。 如果设置为 IP_PMTUDISC_DONT,则会根据接口 MTU 对数据包进行分段。 如果设置为 IP_PMTUDISC_PROBE,则尝试发送大于接口 MTU 的数据包将导致错误。
IPV6_MULTICAST_HOPS DWORD 获取或设置与套接字上的 IPv6 多播流量关联的 TTL 值。 将 TTL 设置为大于 255 的值是非法的。 此选项仅对数据报和原始套接字有效, (套接字类型必须SOCK_DGRAM或SOCK_RAW) 。
IPV6_MULTICAST_IF DWORD 获取或设置用于发送 IPv6 多播流量的传出接口。 此选项不会更改用于接收 IPv6 多播流量的默认接口。 此选项对于多宿主计算机非常重要。 设置此选项的输入值是所需传出接口的 4 字节接口索引(按主机字节顺序排列)。 GetAdaptersAddresses 函数可用于获取接口索引信息。 如果在调用 setsockopt 时将 optval 设置为 NULL,则使用默认 IPv6 接口。 如果 optval 为零,则为发送多播流量指定用于接收多播的默认接口。 获取此选项时, optval 将返回当前默认接口索引,用于按主机字节顺序发送多播 IPv6 流量。
IPV6_MULTICAST_LOOP DWORD (布尔) 指示在套接字上发送的多播数据在目标多播组上也联接时将回显到套接字接收缓冲区。 如果在调用 setsockopt 时将 optval 设置为 1,则启用该选项。 如果设置为 0,则禁用该选项。 此选项仅对数据报和原始套接字有效, (套接字类型必须SOCK_DGRAM或SOCK_RAW) 。
IPV6_PKTINFO DWORD (布尔) 指示LPFN_WSARECVMSG (WSARecvMsg) 函数应返回数据包信息。
IPV6_PROTECTION_LEVEL INT 允许将套接字限制到指定范围,例如具有相同链接本地或站点本地前缀的地址。 提供各种限制级别和默认设置。 有关详细信息 ,请参阅IPV6_PROTECTION_LEVEL
IPV6_RECVIF DWORD (布尔) 指示 IP 堆栈是否应使用有关哪个接口使用数据报套接字接收数据包的详细信息填充控制缓冲区。 如果此值为 true, LPFN_WSARECVMSG (WSARecvMsg) 函数将返回可选控制数据,其中包含接口,其中为数据报套接字接收了数据包。 此选项允许在 WSAMSG 结构中返回接收数据包的 IPv6 接口。 此选项仅对数据报和原始套接字有效, (套接字类型必须SOCK_DGRAM或SOCK_RAW) 。
IPV6_RECVTCLASS DWORD (布尔) 指示 IP 堆栈是否应使用包含已接收数据报上流量类 IPv6 标头字段的消息填充控制缓冲区。 如果此值为 true, LPFN_WSARECVMSG (WSARecvMsg) 函数将返回包含接收的数据报的流量类 IPv6 标头字段值的可选控制数据。 此选项允许在 WSAMSG 结构中返回接收的数据报的流量类 IPv6 标头字段。 将IPV6_TCLASS返回的消息类型。 将返回“流量类”字段的所有 DSCP 和 ECN 位。 此选项仅在数据报套接字上有效, (套接字类型必须SOCK_DGRAM) 。
IPV6_UNICAST_HOPS DWORD 获取或设置与单播流量的 IPv6 套接字关联的当前 TTL 值。 将 TTL 设置为大于 255 的值是非法的。
IPV6_UNICAST_IF DWORD (IF_INDEX) 获取或设置用于发送 IPv6 流量的传出接口。 此选项不会更改用于接收 IPv6 流量的默认接口。 此选项对于多宿主计算机非常重要。 设置此选项的输入值是所需传出接口的 4 字节接口索引(按主机字节顺序排列)。 GetAdaptersAddresses 函数可用于获取接口索引信息。 如果 optval 为零,则用于发送 IPv6 流量的默认接口设置为 unspecified。 获取此选项时, optval 将返回当前默认接口索引,用于按主机字节顺序发送 IPv6 流量。
IPV6_USER_MTU DWORD 获取或设置给定套接字的 IP 层 MTU () 的上限(以字节为单位)。 如果该值高于系统对路径 MTU (可通过查询 IPV6_MTU 套接字选项) 在 连接的套接字上 检索的估计值,则该选项无效。 如果该值较低,则大于此值的出站数据包将被分段,或者无法发送,具体取决于 IPV6_DONTFRAG 的值。 默认值为 MAXULONG) (IP_UNSPECIFIED_USER_MTU。 对于类型安全,应使用 WSAGetIPUserMtuWSASetIPUserMtu 函数,而不是直接使用套接字选项。
IPV6_V6ONLY DWORD (布尔) 指示为 AF_INET6 地址族创建的套接字是否仅适用于 IPv6 通信。 为 AF_INET6 地址族创建的套接字可用于 IPv6 和 IPv4 通信。 一些应用程序可能需要将为 AF_INET6 地址族创建的套接字限制为仅用于 IPv6 通信。 如果此值为非零 (Windows) 上的默认值,则为 AF_INET6 地址系列创建的套接字只能用于发送和接收 IPv6 数据包。 当此值为零时,为 AF_INET6 地址族创建的套接字可用于向 IPv6 地址或 IPv4 地址发送数据包以及从 IPv6 地址或 IPv4 地址接收数据包。 请注意,需要使用 IPv4 映射地址才能与 IPv4 地址进行交互。 Windows Vista 或更高版本上支持此套接字选项。

Windows 对IPPROTO_IPV6套接字选项的支持

选项 Windows 8 Windows Server 2012 Windows 7 Windows Server 2008 Windows Vista
IP_ORIGINAL_ARRIVAL_IF x x x
IPV6_ADD_IFLIST 从 Windows 10 版本 1803 开始
IPV6_ADD_MEMBERSHIP x x x x x
IPV6_DEL_IFLIST 从 Windows 10 版本 1803 开始
IPV6_DROP_MEMBERSHIP x x x x x
IPV6_GET_IFLIST 从 Windows 10 版本 1803 开始
IPV6_HDRINCL x x x x x
IPV6_HOPLIMIT x x x x x
IPV6_IFLIST 从 Windows 10 版本 1803 开始
IPV6_JOIN_GROUP x x x x x
IPV6_LEAVE_GROUP x x x x x
IPV6_MULTICAST_HOPS x x x x x
IPV6_MULTICAST_IF x x x x x
IPV6_MULTICAST_LOOP x x x x x
IPV6_PKTINFO x x x x x
IPV6_PROTECTION_LEVEL x x x x x
IPV6_RECVIF x x x x x
IPV6_UNICAST_HOPS x x x x x
IPV6_UNICAST_IF x x x x x
IPV6_V6ONLY x x x x x

选项 Windows Server 2003 Windows XP
IP_ORIGINAL_ARRIVAL_IF
IPV6_ADD_IFLIST
IPV6_ADD_MEMBERSHIP x x
IPV6_DEL_IFLIST
IPV6_DROP_MEMBERSHIP x x
IPV6_GET_IFLIST
IPV6_HDRINCL x x
IPV6_HOPLIMIT x x
IPV6_IFLIST
IPV6_JOIN_GROUP x x
IPV6_LEAVE_GROUP x x
IPV6_MULTICAST_HOPS x x
IPV6_MULTICAST_IF x x
IPV6_MULTICAST_LOOP x x
IPV6_PKTINFO x x
IPV6_PROTECTION_LEVEL x x
IPV6_RECVIF
IPV6_UNICAST_HOPS x x
IPV6_UNICAST_IF
IPV6_V6ONLY

备注

在为 Windows Vista 及更高版本发布的 Microsoft Windows 软件开发工具包 (SDK) 上,头文件的组织方式已更改, IPPROTO_IPV6 级别在 Winsock2.h 头文件中自动包含在 Winsock2.h 头文件中定义。 IPPROTO_IPV6套接字选项在 Ws2ipdef.h 头文件中定义,该文件自动包含在 Ws2tcpip.h 头文件中。 不应直接使用 Ws2def.hWs2ipdef.h 头文件。

Windows Server 2008 R2 和 Windows 7 支持IP_ORIGINAL_ARRIVAL_IF套接字选项。

要求

要求
标头
Ws2def.h (包括 Winsock2.h) ;
Windows Server 2003 和 Windows XP 上的 Winsock2.h