IPPROTO_IP 套接字选项

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

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

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

选项

选项 获取 设置 Optval 类型 说明
IP_ADD_IFLIST DWORD (IF_INDEX) 将接口索引添加到与 IP_IFLIST 选项关联的 IFLIST。
IP_ADD_MEMBERSHIP ip_mreq 将套接字加入指定接口上提供的多播组。
IP_ADD_SOURCE_MEMBERSHIP ip_mreq_source 加入给定接口上提供的多播组,并接受来自提供的源地址的数据。
IP_BLOCK_SOURCE ip_mreq_source 删除给定源作为提供的多播组和接口的发送方。
IP_DEL_IFLIST DWORD (IF_INDEX) 从与 IP_IFLIST 选项关联的 IFLIST 中删除接口索引。 条目只能由应用程序删除,因此请注意,一旦删除接口,条目可能会过时。
IP_DONTFRAGMENT DWORD (布尔) 指示无论本地 MTU 如何,都不应对数据进行碎片处理。 仅对面向消息的协议有效。 对于 UDP 和 ICMP,Microsoft TCP/IP 提供程序遵循此选项。
IP_DROP_MEMBERSHIP ip_mreq 离开指定接口中的指定多播组。 支持多播时,服务提供商必须支持此选项。 支持在 WSAEnumProtocols 函数调用返回的WSAPROTOCOL_INFO结构中指示:XPI_SUPPORT_MULTIPOINT=1、XP1_MULTIPOINT_CONTROL_PLANE=0、XP1_MULTIPOINT_DATA_PLANE=0。
IP_DROP_SOURCE_MEMBERSHIP ip_mreq_source 删除给定多播组、接口和源地址的成员身份。
IP_GET_IFLIST DWORD[] (IF_INDEX[]) 获取与 IP_IFLIST 选项关联的当前 IFLIST。 如果未启用 IP_IFLIST ,则返回错误。
IP_HDRINCL DWORD (布尔) 设置为 TRUE 时,指示应用程序提供 IP 标头。 仅适用于SOCK_RAW套接字。 如果应用程序提供的值为零,TCP/IP 服务提供程序可能会设置 ID 字段。 IP_HDRINCL选项仅适用于SOCK_RAW类型的协议。 支持SOCK_RAW的 TCP/IP 服务提供程序还应支持IP_HDRINCL。
IP_IFLIST DWORD (布尔) 获取或设置 套接字IP_IFLIST 状态。 如果此选项设置为 true,则数据报接收仅限于 IFLIST 中的接口。 忽略在任何其他接口上收到的数据报。 IFLIST 开始为空。 使用 IP_ADD_IFLISTIP_DEL_IFLIST 编辑 IFLIST。
IP_MTU DWORD 获取系统对路径 MTU 的估计值。 套接字必须已连接。
IP_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 将强制所有传出数据包设置 DF 位,并且尝试发送大于路径 MTU 的数据包将导致错误。 IP_PMTUDISC_DONT 将强制所有传出数据包未设置 DF 位,并且数据包将根据接口 MTU 进行分段。 IP_PMTUDISC_PROBE 将强制所有传出数据包设置 DF 位,并且尝试发送大于接口 MTU 的数据包将导致错误。
IP_MULTICAST_IF DWORD 获取或设置用于发送 IPv4 多播流量的传出接口。 此选项不会更改用于接收 IPv4 多播流量的默认接口。 设置此选项的输入值是按网络字节顺序排列的 4 字节 IPv4 地址。 此 DWORD 参数也可以是按网络字节顺序排列的接口索引。 除 IPv4 地址 0.0.) 0.0 之外,0.x.x 块 (第一个八位字节(0.0.0.0 除外)的任何 IP 地址都被视为接口索引。 接口索引是一个 24 位数字, (此范围保留) ,则不使用 0.0.0.0/8 IPv4 地址块。 接口索引可用于指定 IPv4 的多播流量的默认接口。 如果 optval 为零,则为发送多播流量指定用于接收多播的默认接口。 获取此选项时, optval 将返回当前默认接口索引,用于按主机字节顺序发送多播 IPv4 流量。
IP_MULTICAST_LOOP DWORD (布尔) 对于联接到一个或多个多播组的套接字,此控制是否接收通过所选多播接口发送到这些多播组的 传出 数据包的副本。 默认情况下, IP_MULTICAST_LOOP 启用 (值 1/TRUE) ,因此套接字 接收当前计算机发送的匹配多播数据包。 通过将此选项设置为 0/FALSE) 来禁用此选项 (意味着,即使该套接字在环回接口上打开,也不会接收从本地计算机发送的多播。

这与 POSIX 版本的 IP_MULTICAST_LOOP 不兼容 - 必须在接收套接字上设置 选项;而必须在发送套接字上设置 POSIX 选项。
IP_MULTICAST_TTL DWORD 设置/获取与套接字上的 IP 多播流量关联的 TTL 值。
IP_OPTIONS char [] 指定要插入传出数据包的 IP 选项。 设置新选项将覆盖以前指定的所有选项。 将 optval 设置为零会删除以前指定的所有选项。 不需要IP_OPTIONS支持;若要检查是否支持IP_OPTIONS,请使用 getockopt 获取当前选项。 如果 getsockopt 失败,则不支持IP_OPTIONS。
IP_ORIGINAL_ARRIVAL_IF DWORD (布尔) 指示 LPFN_WSARECVMSG (WSARecvMsg) 函数是否应返回可选控制数据,其中包含为数据报套接字接收数据包的到达接口。 此选项允许在 WSAMSG 结构中返回接收数据包的 IPv4 接口。 此选项仅在数据报和原始套接字上有效, (套接字类型必须SOCK_DGRAM或SOCK_RAW) 。
IP_PKTINFO DWORD 指示 WSARecvMsg 函数应返回数据包信息。
IP_RECEIVE_BROADCAST DWORD (布尔) 允许或阻止广播接收。
IP_RECVIF DWORD (布尔) 指示 IP 堆栈是否应使用有关哪个接口使用数据报套接字接收数据包的详细信息填充控制缓冲区。 如果此值为 true, LPFN_WSARECVMSG (WSARecvMsg) 函数将返回可选控制数据,其中包含接口,其中为数据报套接字接收了数据包。 此选项允许在 WSAMSG 结构中返回接收数据包的 IPv4 接口。 此选项仅在数据报和原始套接字上有效, (套接字类型必须SOCK_DGRAM或SOCK_RAW) 。
IP_RECVTOS DWORD (布尔) 指示 IP 堆栈是否应使用包含已接收数据报上的服务类型 (TOS) IPv4 标头字段的消息填充控制缓冲区。 如果此值为 true, LPFN_WSARECVMSG (WSARecvMsg) 函数将返回可选的控制数据,其中包含接收的数据报的 TOS IPv4 标头字段值。 此选项允许在 WSAMSG 结构中返回接收的数据报的 TOS IPv4 标头字段。 将IP_TOS返回的消息类型。 将返回 TOS 字段的所有 DSCP 和 ECN 位。 此选项仅在数据报套接字上有效, (套接字类型必须SOCK_DGRAM) 。
IP_RECVTTL DWORD (布尔) 指示应在 LPFN_WSARECVMSG (WSARecvMsg ) 函数中返回跃点 (TTL) 信息。 如果在调用 setsockopt 时将 optval 设置为 1,则启用该选项。 如果设置为 0,则禁用该选项。 此选项仅对数据报和原始套接字有效, (套接字类型必须SOCK_DGRAM或SOCK_RAW) 。
IP_TOS DWORD (布尔) 请勿使用。 服务类型 (TOS) 设置应仅使用服务质量 API 进行设置。 有关详细信息,请参阅平台 SDK 的服务质量部分中的 区分 服务。
IP_TTL DWORD (布尔) 更改 TCP/IP 服务提供程序在传出数据报中 IP 标头的 TTL 字段中设置的默认值。 不需要IP_TTL支持;若要检查是否支持IP_TTL,请使用 getockopt 获取当前选项。 如果 getsockopt 失败,则不支持IP_TTL。
IP_UNBLOCK_SOURCE ip_mreq_source 将给定源作为发送方添加到提供的多播组和接口。
IP_UNICAST_IF DWORD (IF_INDEX) 获取或设置用于发送 IPv4 流量的传出接口。 此选项不会更改用于接收 IPv4 流量的默认接口。 此选项对于多宿主计算机非常重要。 设置此选项的输入值是按网络字节顺序排列的 4 字节 IPv4 地址。 此 DWORD 参数必须是按网络字节顺序排列的接口索引。 除 IPv4 地址 0.0.0.0 之外,) 0.x.x 块 (第一个八位字节 0.x.x.x 中的任何 IP 地址都被视为接口索引。 接口索引是一个 24 位数字, (此范围保留) ,则不使用 0.0.0.0/8 IPv4 地址块。 接口索引可用于指定用于发送 IPv4 流量的默认接口。 GetAdaptersAddresses 函数可用于获取接口索引信息。 如果 optval 为零,则用于发送流量的默认接口设置为“未指定”。 获取此选项时, optval 将返回当前默认接口索引,用于按主机字节顺序发送 IPv4 流量。
IP_USER_MTU DWORD 获取或设置给定套接字的 IP 层 MTU (的上限(以字节) 为单位)。 如果该值高于系统对路径 MTU (的估计值,可以通过查询 IP_MTU 套接字选项) 在连接的套接字上检索,则选项无效。 如果该值较低,则大于此值的出站数据包将被分段,或者无法发送,具体取决于 IP_DONTFRAGMENT的值。 默认值为 MAXULONG) (IP_UNSPECIFIED_USER_MTU。 为了保护类型安全,应使用 WSAGetIPUserMtuWSASetIPUserMtu 函数,而不是直接使用套接字选项。
IP_WFP_REDIRECT_CONTEXT 具有控制数据的 WSACMSGHDR 数据报套接字辅助数据类型 (cmsg_type) 指示用户模式 Windows 筛选平台 (WFP) 重定向服务使用的 UDP 套接字的重定向上下文。
IP_WFP_REDIRECT_RECORDS 具有控制数据的 WSACMSGHDR 数据报套接字辅助数据类型 (cmsg_type) 指示用户模式 Windows 筛选平台 (WFP) 重定向服务使用的 UDP 套接字的重定向记录。

Windows 对IP_PROTO选项的支持

选项 Windows 10 Windows 8 Windows Server 2012 Windows 7 Windows Server 2008 Windows Vista
IP_ADD_IFLIST 从 Windows 10 版本 1803 开始
IP_ADD_MEMBERSHIP x x x x x x
IP_ADD_SOURCE_MEMBERSHIP x x x x x x
IP_BLOCK_SOURCE x x x x x x
IP_DEL_IFLIST 从 Windows 10 版本 1803 开始
IP_DONTFRAGMENT x x x x x x
IP_DROP_MEMBERSHIP x x x x x x
IP_DROP_SOURCE_MEMBERSHIP x x x x x x
IP_GET_IFLIST 从 Windows 10 版本 1803 开始
IP_HDRINCL x x x x x x
IP_IFLIST 从 Windows 10 版本 1803 开始
IP_MULTICAST_IF x x x x x x
IP_MULTICAST_LOOP x x x x x x
IP_MULTICAST_TTL x x x x x x
IP_OPTIONS x x x x x x
IP_ORIGINAL_ARRIVAL_IF x x x x
IP_PKTINFO x x x x x x
IP_RECEIVE_BROADCAST x x x x x x
IP_RECVIF 从 Windows 10 版本 1703 开始 x x x x x
IP_RECVTTL x
IP_TOS x x x
IP_TTL x x x x x x
IP_UNBLOCK_SOURCE x x x x x x
IP_UNICAST_IF x x x x x x
IP_WFP_REDIRECT_CONTEXT x x x
IP_WFP_REDIRECT_RECORDS x x x

选项 Windows Server 2003 Windows XP
IP_ADD_IFLIST
IP_ADD_MEMBERSHIP x x
IP_ADD_SOURCE_MEMBERSHIP x x
IP_BLOCK_SOURCE x x
IP_DEL_IFLIST
IP_DONTFRAGMENT x x
IP_DROP_MEMBERSHIP x x
IP_DROP_SOURCE_MEMBERSHIP x x
IP_GET_IFLIST
IP_HDRINCL x x
IP_IFLIST
IP_MULTICAST_IF x x
IP_MULTICAST_LOOP x x
IP_MULTICAST_TTL x x
IP_OPTIONS x x
IP_ORIGINAL_ARRIVAL_IF
IP_PKTINFO x x
IP_RECEIVE_BROADCAST x x
IP_RECVIF
IP_RECVTTL
IP_TOS
IP_TTL x x
IP_UNBLOCK_SOURCE x x
IP_UNICAST_IF
IP_WFP_REDIRECT_CONTEXT
IP_WFP_REDIRECT_RECORDS

备注

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

在针对 Windows Server 2003 和 Windows XP 发布的平台 SDK 中, IPPROTO_IP 级别在 Winsock2.h 头文件中定义。 某些 IPPROTO_IP 套接字选项在 Ws2tcpip.h 头文件中定义。 其余IPPROTO_IP套接字选项在 Winsock2.h 头文件自动包含的 Wsipv6ok.h 头文件中定义。 永远不应直接使用 Wsipv6ok.h 头文件。

要求

要求
标头
Ws2def.h (包括 Winsock2.h) ;
Ws2ipdef.h (包括 Ws2tcpip.h) ;
Wsipv6ok.h (包括 Winsock2.h)