IPPROTO_IP 套接字选项

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

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

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

选项

选项 Get 设置 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。 仅适用于面向消息的协议。 Microsoft TCP/IP 提供程序遵循 UDP 和 ICMP 的此选项。
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 之外,0.x.x.x 块(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_RECVECN DWORD(布尔值) 指示 IP 堆栈是否应该使用包含所接收数据报上的服务类型 (TOS) IPv4 标头字段 ECN 位的消息填充控制缓冲区。 如果此值为 true,则 LPFN_WSARECVMSG (WSARecvMsg) 函数将返回包含所接收数据报的 TOS IPv4 标头字段值 ECN 位的可选控制数据。 此选项允许在 WSAMSG 结构中返回所接收数据报的 TOS IPv4 标头字段的 ECN 位。 返回的消息类型将是 IP_ECN。 将返回 TOS 字段的所有 2 个 ECN 位。 此选项仅对数据报和原始套接字有效(套接字类型必须为 SOCK_DGRAM 或 SOCK_RAW)。 对于类型安全性,你应使用 WSAGetRecvIPEcnWSASetRecvIPEcn 函数,而不是直接使用套接字选项。
IP_RECVTTL DWORD(布尔值) 指示应在 LPFN_WSARECVMSG (WSARecvMsg) 函数中返回跃点 (TTL) 信息。 如果对 setsockopt 调用将 optval 设置为 1,则启用该选项。 设置为 0,则此选项被禁用。 此选项仅对数据报和原始套接字有效(套接字类型必须为 SOCK_DGRAM 或 SOCK_RAW)。
IP_TOS DWORD(布尔值) 请勿使用。 服务类型 (TOS) 设置只能使用服务质量 API 进行设置。 有关详细信息,请参阅平台 SDK 的“服务质量”部分中的差异化服务
IP_TTL DWORD(布尔值) 更改传出数据报中 IP 标头的 TTL 字段中 TCP/IP 服务提供者设置的默认值。 不需要 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 之外,0.x.x.x 块(0 的第一个八进制数)中的任何 IP 地址都被视为接口索引。 接口索引是一个 24 位数字,不使用 0.0.0.0/8 IPv4 地址块(此范围是保留的范围)。 接口索引可用于为 IPv4 发送流量指定默认接口。 GetAdaptersAddresses 函数可用于获取接口索引信息。 如果 optval 为零,则用于发送流量的默认接口被设置为未指定。 获取此选项时,optval 会返回用于以主机字节顺序发送 IPv4 流量的当前默认接口索引。
IP_USER_MTU DWORD 获取或设置给定套接字的 IP 层 MTU 的上限(以字节为单位)。 如果该值高于系统的路径 MTU 估计值(可以通过查询 IP_MTU 套接字选项来检索连接的套接字),则该选项不起作用。 如果该值较低,则大于此值的出站数据包将被分段,或者无法发送,具体取决于 IP_DONTFRAGMENT 的值。 默认值为 IP_UNSPECIFIED_USER_MTU (MAXULONG)。 对于类型安全性,你应使用 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
IP_ADD_SOURCE_MEMBERSHIP
IP_BLOCK_SOURCE
IP_DEL_IFLIST 从 Windows 10 版本 1803 开始
IP_DONTFRAGMENT
IP_DROP_MEMBERSHIP
IP_DROP_SOURCE_MEMBERSHIP
IP_GET_IFLIST 从 Windows 10 版本 1803 开始
IP_HDRINCL
IP_IFLIST 从 Windows 10 版本 1803 开始
IP_MULTICAST_IF
IP_MULTICAST_LOOP
IP_MULTICAST_TTL
IP_OPTIONS
IP_ORIGINAL_ARRIVAL_IF
IP_PKTINFO
IP_RECEIVE_BROADCAST
IP_RECVIF 从 Windows 10 版本 1703 开始
IP_RECVTTL
IP_TOS
IP_TTL
IP_UNBLOCK_SOURCE
IP_UNICAST_IF
IP_WFP_REDIRECT_CONTEXT
IP_WFP_REDIRECT_RECORDS

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

注解

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

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

要求

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