IPPROTO_IPV6 套接字选项

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

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

某些套接字选项需要的说明非这些表所能传达;此类选项包含指向其他信息的链接。

选项

选项 get set 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_RECVECN DWORD(布尔值) 指示 IP 堆栈是否应该使用包含所接收数据报上的流量类 IPv6 标头字段 ECN 位的消息填充控制缓冲区。 如果此值为 true,则 LPFN_WSARECVMSG (WSARecvMsg) 函数将返回包含所接收数据报的流量类 IPv6 标头字段值 ECN 位的可选控制数据。 此选项允许在 WSAMSG 结构中返回所接收数据报的流量类 IPv6 标头字段 ECN 位。 返回的消息类型将是 IPV6_ECN。 将返回流量类字段的所有 2 个 ECN 位。 此选项仅对数据报和原始套接字有效(套接字类型必须为 SOCK_DGRAM 或 SOCK_RAW)。 对于类型安全性,你应使用 WSAGetRecvIPEcnWSASetRecvIPEcn 函数,而不是直接使用套接字选项。
IPV6_UNICAST_HOPS DWORD 获取或设置与单播流量的 IPv6 套接字关联的当前 TTL 值。 将 TTL 设置为大于 255 的值是非法的。
IPV6_UNICAST_IF DWORD (IF_INDEX) 获取或设置用于发送 IPv6 流量的传出接口。 此选项不会更改用于接收 IPv6 流量的默认接口。 此选项对于多宿主计算机非常重要。 用于设置此选项的输入值是所需传出接口的 4 字节接口索引(采用主机字节顺序)。 GetAdaptersAddresses 函数可用于获取接口索引信息。 如果 optval 为零,则用于发送 IPv6 流量的默认接口被设置为未指定。 获取此选项时,optval 会返回用于以主机字节顺序发送 IPv6 流量的当前默认接口索引。
IPV6_USER_MTU DWORD 获取或设置给定套接字的 IP 层 MTU 的上限(以字节为单位)。 如果该值高于系统的路径 MTU 估计值(可以通过查询 IPV6_MTU 套接字选项来检索连接的套接字),则该选项不起作用。 如果该值较低,则大于此值的出站数据包将被分段,或者无法发送,具体取决于 IPV6_DONTFRAG 的值。 默认值为 IP_UNSPECIFIED_USER_MTU (MAXULONG)。 对于类型安全性,你应使用 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
IPV6_ADD_IFLIST 从 Windows 10 版本 1803 开始
IPV6_ADD_MEMBERSHIP
IPV6_DEL_IFLIST 从 Windows 10 版本 1803 开始
IPV6_DROP_MEMBERSHIP
IPV6_GET_IFLIST 从 Windows 10 版本 1803 开始
IPV6_HDRINCL
IPV6_HOPLIMIT
IPV6_IFLIST 从 Windows 10 版本 1803 开始
IPV6_JOIN_GROUP
IPV6_LEAVE_GROUP
IPV6_MULTICAST_HOPS
IPV6_MULTICAST_IF
IPV6_MULTICAST_LOOP
IPV6_PKTINFO
IPV6_PROTECTION_LEVEL
IPV6_RECVIF
IPV6_UNICAST_HOPS
IPV6_UNICAST_IF
IPV6_V6ONLY

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

注解

在为 Windows Vista 及更高版本发布的 Microsoft Windows 软件开发工具包 (SDK) 中,头文件的组织发生了变化,IPPROTO_IPV6 级别在 Ws2def.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