Winsock IOCTL

本部分介绍 Winsock 套接字输入/输出控件, (IOCTL) 适用于各种版本的 Windows 操作系统。 使用 WSAIoctlWSPIoctl 函数发出 Winsock IOCTL 来控制套接字、传输协议或通信子系统的模式。

一些 Winsock IOCTL 需要比此表所能传达的更多的解释:此类选项包含指向其他主题的链接。

可以采用一种编码方案,以保留当前定义的 ioctlsocket opcode,同时提供一种便捷的方式对 opcode 标识符空间进行分区,因为 dwIoControlCode 参数现在是一个 32 位实体。 dwIoControlCode 参数是在添加新控制代码时允许协议和供应商独立性,同时保持与 Windows 套接字 1.1 和 Unix 控制代码的向后兼容性。 dwIoControlCode 参数具有以下形式。

I O V T 供应商/地址系列 代码
3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0

注意

表中显示的 dwIoControlCode 参数中的位必须按列从上到下垂直读取。 因此,最左边的位是位 31,下一位是位 30,最右边的位是位 0。

如果输入缓冲区对代码有效,则设置 I,如 IOC_IN

如果输出缓冲区对代码有效,则设置 O,如 IOC_OUT。 使用输入和输出缓冲区同时设置 I 和 O 的控制代码。

如果代码没有参数,则设置 V,就像 IOC_VOID一样。

T 是定义 IOCTL 类型的 2 位数量。 定义了以下值:

0 IOCTL 是标准的 Unix IOCTL 代码,与 FIONREADFIONBIO 一样。

1 IOCTL 是通用的 Windows 套接字 2 IOCTL 代码。 为 Windows 套接字 2 定义的新 IOCTL 代码的 T == 1。

2 IOCTL 仅适用于特定地址系列。

3 IOCTL 仅适用于特定供应商的提供商,与 IOC_VENDOR 一样。 此类型允许为公司分配供应商 /地址系列 参数中显示的供应商编号。 然后,供应商可以定义特定于该供应商的新 IOCTL,而无需向清算所注册 IOCTL,从而提供供应商的灵活性和隐私性。

供应商/地址系列 一个 11 位数量,定义拥有代码 (如果 T == 3) 或包含代码应用于 (的地址系列(如果 T == 2) ),则为 11 位数量。 如果这是一个 unix IOCTL 代码, (T == 0) 则此参数的值与 Unix 上的代码相同。 如果这是泛型 Windows 套接字 2 IOCTL (T == 1) 则此参数可用作代码参数的扩展来提供其他代码值。

代码 包含操作的特定 IOCTL 代码的 16 位数量。

Unix IOCTL 代码

支持以下 Unix IOCTL 代码 (命令) 。

FIONBIO

套接字上启用或禁用非阻止模式。 lpvInBuffer 参数指向一个无符号长 (QoS) ,如果要启用非阻止模式,则为非零;如果要禁用该模式,则为零。 创建套接字时,它将在阻止模式下运行 (即) 禁用非阻止模式。 这与 BSD 套接字一致。

WSAAsyncSelectWSAEventSelect 例程自动将套接字设置为非阻止模式。 如果已在套接字上发出 WSAAsyncSelectWSAEventSelect ,则使用 WSAIoctl 将套接字重新设置为阻止模式的任何尝试都将失败,WSAEINVAL 会失败。 若要将套接字重新设置为阻止模式,应用程序必须首先通过调用 lEvent 参数等于零的 WSAAsyncSelect 来禁用 WSAAsyncSelect,或者通过调用 WSAEventSelectlNetworkEvents 参数等于零)来禁用 WSAEventSelect

FIONREAD

确定 可从套接字以原子方式读取的数据量。 lpvOutBuffer 参数指向 WSAIoctl 存储结果的无符号长

如果 s 参数中 传递的套接字面向流 (例如,类型SOCK_STREAM) , 则 FIONREAD 将返回可在单个接收操作中读取的总数据量;这通常与套接字 (上排队的总数据量相同,因为数据流是面向字节的,无法保证) 。

如果 s 参数中传递的套接字面向消息 (例如,键入 SOCK_DGRAM) , FIONREAD 将返回报告可读取的总字节数,而不是第一个数据报 (消息) 在套接字上排队的大小。

SIOCATMARK

确定是否已读取所有 OOB 数据。 这仅适用于流式 (的套接字,例如,已配置为内联接收任何 OOB 数据 (SO_OOBINLINE) 的类型SOCK_STREAM) 。 如果没有 OOB 数据正在等待读取,则操作返回 TRUE。 否则,它将返回 FALSE,并且对套接字执行的下一个接收操作将检索标记前面的部分或全部数据;应用程序应使用 SIOCATMARK 操作来确定是否存在任何剩余项。 如果紧急 (带外) 数据之前有任何正常数据,则按顺序接收数据。 (请注意, recv 操作永远不会在同一调用中混合 OOB 和正常数据。) lpvOutBuffer 指向 WSAIoctl 存储结果的 BOOL。

Windows 套接字 2 命令

支持以下 Windows 套接字 2 命令。

SIO_ACQUIRE_PORT_RESERVATION (操作码设置:I、T==3)

请求 TCP 或 UDP 端口块的运行时预留。 对于运行时端口预留,端口池要求从向其授予预留的套接字的进程使用预留。 运行时端口预留仅持续到调用 SIO_ACQUIRE_PORT_RESERVATION IOCTL 的套接字的生存期。 相比之下,使用 CreatePersistentTcpPortReservationCreatePersistentUdpPortReservation 函数创建的永久性端口预留可由任何能够获取持久预留的进程使用。

有关详细信息,请参阅 SIO_ACQUIRE_PORT_RESERVATION 参考。

SIO_ACQUIRE_PORT_RESERVATION 在 Windows Vista 和更高版本的操作系统上受支持。

SIO_ADDRESS_LIST_CHANGE (操作码设置:V、T==1)

接收应用程序可以绑定到的套接字协议系列的本地传输地址列表中发生更改的通知。 完成此 IOCTL 后,不会提供任何输出信息;完成仅指示可用本地地址列表已更改,应通过 SIO_ADDRESS_LIST_QUERY再次查询。

假定 (,但不需要) 应用程序使用重叠的 I/O 在完成 SIO_ADDRESS_LIST_CHANGE 请求时收到更改通知。 或者,如果在非阻塞套接字上发出 SIO_ADDRESS_LIST_CHANGE IOCTL,并且没有重叠参数 (lpOverlapped/ lpCompletionRoutine 设置为 NULL) ,它将立即完成并显示错误 WSAEWOULDBLOCK。 然后,应用程序可以通过调用 WSAEventSelectWSAAsyncSelect 来等待地址列表更改事件,并在网络事件位掩码中设置了FD_ADDRESS_LIST_CHANGE位。

SIO_ADDRESS_LIST_QUERY (操作码设置:O、T==1)

获取应用程序可以绑定到的套接字协议系列的本地传输地址列表。 地址列表因地址系列而异,某些地址从列表中排除。

注意

在 Windows 即插即用环境中,可以动态添加和删除地址。 因此,应用程序不能依赖于 SIO_ADDRESS_LIST_QUERY 返回的信息是永久性的。 应用程序可以通过 SIO_ADDRESS_LIST_CHANGE IOCTL 注册地址更改通知,该 IOCTL 通过重叠 I/O 或FD_ADDRESS_LIST_CHANGE事件提供通知。 以下操作序列可用于保证应用程序始终具有当前地址列表信息:

  • IOCTL SIO_ADDRESS_LIST_CHANGE 问题
  • IOCTL SIO_ADDRESS_LIST_QUERY 问题
  • 每当 SIO_ADDRESS_LIST_CHANGE IOCTL 通过重叠 I/O 或通过) 发出FD_ADDRESS_LIST_CHANGE事件信号来通知地址列表更改 (应用时,应重复整个操作序列。

有关详细信息,请参阅 SIO_ADDRESS_LIST_QUERY 参考。 windows 2000 及更高版本支持SIO_ADDRESS_LIST_QUERY。

SIO_APPLY_TRANSPORT_SETTING (操作码设置:I、T==3)

将传输设置应用于套接字。 正在应用的传输设置基于在 lpvInBuffer 参数中传递的TRANSPORT_SETTING_ID

当前定义的唯一传输设置是 TCP 套接字上的 REAL_TIME_NOTIFICATION_CAPABILITY 功能。

如果传递 TRANSPORT_SETTING_IDGuid 成员设置为 REAL_TIME_NOTIFICATION_CAPABILITY,则这是一个请求,即应用用于 ControlChannelTrigger 的 TCP 套接字的实时通知设置,以在 Windows 应用商店应用中接收后台网络通知。

有关更多详细信息,请参阅 SIO_APPLY_TRANSPORT_SETTING 参考。 Windows 8、Windows Server 2012 及更高版本支持SIO_APPLY_TRANSPORT_SETTING。

SIO_ASSOCIATE_HANDLE (操作码设置:I、T==1)

将此套接字与附带接口的指定句柄关联。 输入缓冲区包含对应于配套接口 (清单常量(例如,TH_NETDEV 和 TH_TAPI.) )的整数值,后跟一个是指定配套接口句柄的值,以及任何其他必需的信息。 有关特定于特定配套接口的详细信息,请参阅 Winsock 附件 中的相应部分。 总大小反映在输入缓冲区长度中。 不需要输出缓冲区。 WSAENOPROTOOPT 错误代码指示不支持此 IOCTL 的服务提供商。 可以使用 SIO_TRANSLATE_HANDLE 检索此 IOCTL 关联的句柄。

例如,如果特定提供程序提供 (1) 大量对套接字行为的附加控件, (2,) 控件足够特定于提供程序,它们不会映射到现有 Windows 套接字函数或将来可能定义的函数,则可以使用配套接口。 建议使用组件对象模型 (COM) 而不是此 IOCTL 来发现和跟踪套接字可能支持的其他接口。 此 IOCTL 用于 (反向) 与 COM 不可用或因其他原因无法使用的系统兼容。

SIO_ASSOCIATE_PORT_RESERVATION (操作码设置:I、T==3)

将套接字与端口预留令牌标识的 TCP 或 UDP 端口块的永久性或运行时预留相关联。 在绑定套接字之前,必须颁发 SIO_ASSOCIATE_PORT_RESERVATION IOCTL。 如果和当套接字绑定时,将从给定令牌标识的端口预留中选择分配给它的端口。 如果指定的预留中没有可用的端口, 绑定 函数调用将失败。

有关更多详细信息,请参阅 SIO_ASSOCIATE_PORT_RESERVATION 参考。

windows Vista 和更高版本的操作系统支持SIO_ASSOCIATE_PORT_RESERVATION。

SIO_BASE_HANDLE (opcode 设置:O、T==1)

检索给定套接字的基本服务提供程序句柄。 返回的值为 SOCKET

分层服务提供商永远不会截获此 IOCTL,因为返回值必须是来自基本服务提供程序的套接字句柄。

如果输出缓冲区对于套接字句柄不够大, (cbOutBuffer 小于 SOCKET) 或 lpvOutBuffer 参数为 NULL 指针的大小,则此 IOCTL 的结果 返回SOCKET_ERRORWSAGetLastError 将返回 WSAEFAULT

SIO_BASE_HANDLEMswsock.h 头文件中定义,在 Windows Vista 及更高版本上受支持。

SIO_BSP_HANDLE (操作码设置:O、T==1)

检索 WSASendMsg 函数使用的套接字的基本服务提供程序句柄。 返回的值为 SOCKET

分层服务提供程序使用此 Ioctl 来确保提供程序截获 WSASendMsg 函数。

如果输出缓冲区对于套接字句柄不够大, (cbOutBuffer 小于 SOCKET) 或 lpvOutBuffer 参数为 NULL 指针的大小,则此 IOCTL 的结果 返回SOCKET_ERRORWSAGetLastError 将返回 WSAEFAULT

SIO_BSP_HANDLEMswsock.h 头文件中定义,在 Windows Vista 及更高版本上受支持。

SIO_BSP_HANDLE_SELECT (opcode 设置:O、T==1)

检索 select 函数使用的套接字的基本服务提供程序句柄。 返回的值为 SOCKET

分层服务提供商使用此 Ioctl 来确保提供程序截获 select 函数。

如果输出缓冲区对于套接字句柄不够大, (cbOutBuffer 小于 SOCKET) 或 lpvOutBuffer 参数为 NULL 指针的大小,则此 IOCTL 的结果 返回SOCKET_ERRORWSAGetLastError 将返回 WSAEFAULT

SIO_BSP_HANDLE_SELECTMswsock.h 头文件中定义,在 Windows Vista 及更高版本上受支持。

SIO_BSP_HANDLE_POLL (opcode 设置:O、T==1)

检索 WSAPoll 函数使用的套接字的基本服务提供程序句柄。 lpOverlapped 参数必须是 NULL 指针。 返回的值为 SOCKET

分层服务提供程序使用此 Ioctl 来确保提供程序截获 WSAPoll 函数。

如果输出缓冲区对于套接字句柄不够大, (cbOutBuffer 小于 SOCKET) 的大小, 则 lpvOutBuffer 参数为 NULL 指针,或 lpOverlapped 参数不是 NULL 指针, SOCKET_ERROR 返回此 IOCTL 的结果, WSAGetLastError 返回 WSAEFAULT

SIO_BSP_HANDLE_POLLMswsock.h 头文件中定义,在 Windows Vista 及更高版本上受支持。

SIO_CHK_QOS (操作码设置:I、O、T==3)

检索有关 QoS 流量特征的信息。 在发送系统的过渡阶段,在流设置和接收 RESV 消息之间 (请参阅 RSVP 服务如何调用 TC ,详细了解过渡阶段) ,与 RSVP 流关联的流量基于服务类型 (BEST EFFORTCONTROLLED LOADGUARANTEED) 。 有关详细信息,请参阅平台 SDK 的“服务质量”部分中的“使用SIO_CHK_QOS”。

SIO_CPU_AFFINITY (操作码设置:I、T==3)

启用端口共享和接收指示并行化。 当应用程序使用此套接字选项将套接字关联到不同的处理器,然后将套接字绑定到同一地址时,接收指示将基于接收端缩放 (RSS) 哈希分布到套接字上。 RSS 设置不会更改,因此将始终在同一处理器上指示任何给定流 (本地终结点、远程终结点对) 。 因此,属于给定流的所有数据包都将指示到同一套接字。 必须在绑定之前调用此 IOCTL,否则将返回 WSAEINVAL。 输入缓冲区是一个处理器索引, (从 0 开始) USHORT 类型。 IOCTL 与 SO_REUSEADDR 和 SO_REUSE_MULTICASTPORT 不兼容。 仅 UDP 套接字支持。

注意

如果面向版本 10.0.19041.0 (Windows 10版本 2004) 的 Windows SDK,请使用 值0x98000015而不是名称SIO_CPU_AFFINITY

SIO_ENABLE_CIRCULAR_QUEUEING (操作码设置:V、T==1)

向基础面向消息的服务提供程序指示,由于缓冲区队列溢出,不应删除新到达的消息。 相反,应消除队列中最早的消息,以便容纳新到达的消息。 不需要输入和输出缓冲区。 请注意,此 IOCTL 仅适用于与不可靠的面向消息的协议关联的套接字。 WSAENOPROTOOPT 错误代码指示不支持此 IOCTL 的服务提供商。

SIO_FIND_ROUTE (操作码设置:O、T==1)

发出后,此 IOCTL 请求发现到指定为输入缓冲区中 sockaddr 的远程地址的路由。 如果地址已存在于本地缓存中,则其条目将失效。 对于 Novell 的 IPX,此调用会启动 IPX GetLocalTarget (GLT) ,用于查询网络以获取给定的远程地址。

SIO_FLUSH (操作码设置:V、T==1)

放弃与此套接字关联的发送队列的当前内容。 不需要输入和输出缓冲区。 WSAENOPROTOOPT 错误代码指示不支持此 IOCTL 的服务提供商。

SIO_GET_BROADCAST_ADDRESS (操作码设置:O、T==1)

此 IOCTL 使用 sockaddr 结构填充输出缓冲区,该结构包含适合用于 sendto/ WSASendTo 的广播地址。 IPv6 套接字不支持此 IOCTL,并返回 WSAENOPROTOOPT 错误代码。

SIO_GET_EXTENSION_FUNCTION_POINTER (操作码设置:O、I、T==1)

检索指向关联服务提供程序支持的指定扩展函数的指针。 输入缓冲区包含一个全局唯一标识符 (GUID) ,其值标识相关的扩展函数。 指向所需函数的指针在输出缓冲区中返回。 扩展函数标识符由服务提供商供应商建立,应包含在介绍扩展函数功能和语义的供应商文档中。

Windows TCP/IP 服务提供程序支持的扩展函数的 GUID 值在 Mswsock.h 头文件中定义。 这些 GUID 的可能值如下所示:

术语 说明
WSAID_ACCEPTEX
AcceptEx 扩展函数。
WSAID_CONNECTEX
ConnectEx 扩展函数。
WSAID_DISCONNECTEX
DisconnectEx 扩展函数。
WSAID_GETACCEPTEXSOCKADDRS
GetAcceptExSockaddrs 扩展函数。
WSAID_TRANSMITFILE
TransmitFile 扩展函数。
WSAID_TRANSMITPACKETS
TransmitPackets 扩展函数。
WSAID_WSARECVMSG
LPFN_WSARECVMSG (WSARecvMsg) 扩展函数。
WSAID_WSASENDMSG
WSASendMsg 扩展函数。

SIO_GET_GROUP_QOS (操作码设置:O、I、T==1)

保留供将来与套接字一起使用。

检索与此套接字所属的套接字组关联的 QOS 结构。 输入缓冲区是可选的。 某些协议 (例如,RSVP) 允许使用输入缓冲区来限定服务质量请求。 QOS 结构将复制到输出缓冲区中。 如果此套接字不属于相应的套接字组,则返回的 QOS 结构的 SendFlowspecReceivingFlowspec 成员将设置为 NULLWSAENOPROTOOPT 错误代码指示为不支持服务质量的服务提供商。

SIO_GET_INTERFACE_LIST (opcode 设置:O、T==0)

INTERFACE_INFO 结构数组的形式返回配置的 IP 接口及其参数的列表。

注意

对于符合 Windows 套接字 2 的 TCP/IP 服务提供商,必须支持此命令。

lpvOutBuffer 参数指向缓冲区,该缓冲区将有关接口的信息存储为接口上单播 IP 地址的INTERFACE_INFO结构数组。 cbOutBuffer 参数指定输出缓冲区的长度。 返回的接口数 (lpvOutBuffer 参数指向的缓冲区中返回的结构数) 可以基于 lBytesReturned 参数中返回的输出缓冲区的实际长度来确定。

如果使用 SIO_GET_INTERFACE_LIST 调用 WSAIoctl 函数,并且套接字 参数的级别成员未定义为 IPPROTO_IP,则返回 WSAEINVAL。 如果指定输出缓冲区长度太小的 cbOutBuffer 参数收到已配置接口的列表,则使用 SIO_GET_INTERFACE_LIST 调用 WSAIoctl 函数将返回 WSAEFAULT

windows Me/98 和 Windows NT 4.0 SP4 及更高版本支持SIO_GET_INTERFACE_LIST。

SIO_GET_INTERFACE_LIST_EX (opcode 设置:O、T==0)

保留供将来与套接字一起使用。

INTERFACE_INFO_EX 结构数组的形式返回配置的 IP 接口及其参数的列表。

lpvOutBuffer 参数指向缓冲区,该缓冲区将有关接口的信息存储为接口上单播 IP 地址的INTERFACE_INFO_EX结构数组。 cbOutBuffer 参数指定输出缓冲区的长度。 根据 lpvBytesReturned 参数中返回的输出缓冲区的实际长度,可以确定返回的接口数 (lpvOutBuffer) 中返回的结构数。

Windows 当前不支持SIO_GET_INTERFACE_LIST_EX。

SIO_GET_QOS (opcode 设置:O、T==1)

保留供将来与套接字一起使用。 检索与套接字关联的 QOS 结构。 输入缓冲区是可选的。 某些协议 (例如,RSVP) 允许使用输入缓冲区来限定服务质量请求。 QOS 结构将复制到输出缓冲区中。 输出缓冲区的大小必须足够大,才能包含完整的 QOS 结构。 WSAENOPROTOOPT 错误代码指示为不支持服务质量的服务提供商。

在套接字连接之前,发送方不得调用 SIO_GET_QOS

接收方可以在绑定 立即调用SIO_GET_QOS。

SIO_GET_TX_TIMESTAMP

用于获取传输 (TX) 数据包的时间戳的套接字 IOCTL。 仅对数据报套接字有效。

SIO_GET_TX_TIMESTAMP控制代码从套接字的传输时间戳队列中删除传输时间戳。 首先使用 SIO_TIMESTAMPING 套接字 IOCTL 启用时间戳接收。 然后,使用以下参数调用 WSAIoctl (或 WSPIoctl) 函数,按 ID 检索 tx 时间戳。

对于 SIO_GET_TX_TIMESTAMP,输入是 UINT32 时间戳 ID,输出是 UINT64 时间戳值。 成功后,tx 时间戳可用并返回。 如果没有可用的传输时间戳,则 WSAGetLastError 返回 WSAEWOULDBLOCK

注意

通过 UDP_SEND_MSG_SIZE 执行合并发送时,不支持 TX 时间戳。

另请参阅 Winsock 时间戳

SIO_IDEAL_SEND_BACKLOG_CHANGE (操作码设置:V、T==0)

当基础连接的理想发送积压工作 (ISB) 值更改时,通知应用程序。

使用 Windows 套接字通过 TCP 连接发送数据时,请务必在 TCP 中 (发送但尚未确认) 保留足够的未完成数据量,以实现最高的吞吐量。 为 TCP 连接实现最佳吞吐量而未完成的数据量的理想值称为 (ISB) 大小的理想发送积压工作。 ISB 值是 TCP 连接的带宽延迟乘积和接收方播发接收窗口 (的函数,部分是网络) 拥塞量。

每个连接的 ISB 值可从 Windows Server 2008、Windows Vista SP1 和更高版本的操作系统中的 TCP 协议实现中获取。 SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL 可由应用程序用于在 ISB 值动态更改连接时获取通知。

有关详细信息,请参阅 SIO_IDEAL_SEND_BACKLOG_CHANGE 参考。

SIO_IDEAL_SEND_BACKLOG_CHANGE 在 Windows Server 2008、具有 SP1 的 Windows Vista 和更高版本的操作系统上受支持。

SIO_IDEAL_SEND_BACKLOG_QUERY (opcode 设置:O、T==0)

检索基础连接的理想发送积压工作 (ISB) 值。

使用 Windows 套接字通过 TCP 连接发送数据时,请务必在 TCP 中 (发送但尚未确认) 保留足够的未完成数据量,以实现最高的吞吐量。 为 TCP 连接实现最佳吞吐量而未完成的数据量的理想值称为 (ISB) 大小的理想发送积压工作。 ISB 值是 TCP 连接的带宽延迟乘积和接收方播发接收窗口 (的函数,部分是网络) 拥塞量。

每个连接的 ISB 值可从 Windows Server 2008 及更高版本中的 TCP 协议实现获取。 SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL 可由应用程序用于查询 ISB 值以获取连接。

有关更多详细信息,请参阅 SIO_IDEAL_SEND_BACKLOG_QUERY 参考。

SIO_IDEAL_SEND_BACKLOG_QUERY 在 Windows Server 2008、带 SP1 的 Windows Vista 和更高版本的操作系统上受支持。

SIO_KEEPALIVE_VALS (操作码设置:I、T==3)

启用或禁用 TCP 保持连接 选项的每个连接设置,该选项指定 TCP 保持连接超时和间隔。 有关“保持连接”选项的详细信息,请参阅 IETF 网站上提供的有关 Internet 主机的要求 - RFC 1122 中指定的通信层的第 4.2.3.6 部分。 (此资源可能仅以英语提供。)

SIO_KEEPALIVE_VALS 可用于启用或禁用保持连接探测,并设置保持连接超时和间隔。 保持连接超时指定超时(以毫秒为单位),在发送第一个保持连接数据包之前没有活动。 保持连接间隔指定在未收到确认的情况下发送连续保持连接数据包的间隔(以毫秒为单位)。

SO_KEEPALIVE选项是SOL_SOCKET套接字选项之一,还可用于启用或禁用连接上的 TCP 保持连接状态,以及查询此选项的当前状态。 若要查询是否在套接字上启用了 TCP keep-alive,可以使用 SO_KEEPALIVE 选项调用 getsockopt 函数。 若要启用或禁用 TCP keep-alive,可以使用 SO_KEEPALIVE 选项调用 setsockopt 函数。 如果使用 SO_KEEPALIVE 启用 TCP 保持连接,则默认 TCP 设置将用于保持连接超时和间隔,除非这些值已使用 SIO_KEEPALIVE_VALS 更改。

有关详细信息,请参阅 SIO_KEEPALIVE_VALS 参考。 Windows 2000 及更高版本支持SIO_KEEPALIVE_VALS。

SIO_LOOPBACK_FAST_PATH (操作码设置:I、T==3)

配置 TCP 套接字,以便在环回接口上降低延迟并加快操作速度。 此 IOCTL 请求 TCP/IP 堆栈为此套接字上的环回操作使用特殊的快速路径。 SIO_LOOPBACK_FAST_PATH IOCTL 只能与 TCP 套接字一起使用。 此 IOCTL 必须在环回会话的两端使用。 使用 IPv4 或 IPv6 环回接口支持 TCP 环回快速路径。 默认情况下, 禁用SIO_LOOPBACK_FAST_PATH

有关详细信息,请参阅 SIO_LOOPBACK_FAST_PATH 参考。 Windows 8、Windows Server 2012 及更高版本支持SIO_LOOPBACK_FAST_PATH。

SIO_MULTIPOINT_LOOPBACK (操作码设置:V、T==1)

控制本地计算机上的应用程序发送的数据 (不一定由多播会话中的同一套接字) 发送的数据是否会由联接到环回接口上的多播目标组的套接字接收。 如果值为 TRUE ,则本地计算机上的应用程序发送的多播数据将传递到环回接口上的侦听套接字。 值为 FALSE 可防止本地计算机上的应用程序发送的多播数据传递到环回接口上的侦听套接字。 默认情况下, SIO_MULTIPOINT_LOOPBACK 处于启用状态。

SIO_MULTICAST_SCOPE (操作码设置:I、T==1)

指定多播传输的发生范围。 范围定义为要涵盖的路由网段数。 范围为 0 表示多播传输不会放置在网络上,而是可以跨本地主机内的套接字传播。 范围值 1 (默认) 指示传输将放置在线路上,但不会跨越任何路由器。 范围值越大,确定可交叉的路由器数。 请注意,这对应于 IP 多播中的生存时间 (TTL) 参数。 默认情况下,范围为 1。

SIO_QUERY_RSS_PROCESSOR_INFO (操作码设置:O、T==1)

查询套接字与 RSS 处理器核心与 NUMA 节点之间的关联。

SIO_QUERY_RSS_PROCESSOR_INFO IOCTL 返回包含PROCESSOR_NUMBER和 NUMA 节点 ID 的SOCKET_PROCESSOR_AFFINITY结构。 返回 的PROCESSOR_NUMBER 结构包含组号和组中的相对处理器编号。

有关详细信息,请参阅 SIO_QUERY_RSS_PROCESSOR_INFO 参考。 Windows 8、Windows Server 2012 及更高版本支持SIO_QUERY_RSS_PROCESSOR_INFO。

SIO_QUERY_RSS_SCALABILITY_INFO (操作码设置:O、T==3)

接收方缩放 (RSS) 功能的查询卸载接口。 为 SIO_QUERY_RSS_SCALABILITY_INFO 返回的参数结构在 Mstcpip.h 头文件中定义的 RSS_SCALABILITY_INFO 结构中指定。 此结构定义如下:

// Scalability info for the transport
typedef struct _RSS_SCALABILITY_INFO {
   BOOLEAN RssEnabled;
} RSS_SCALABILITY_INFO, *PRSS_SCALABILITY_INFO;

RssEnabled 成员中返回的值指示是否在至少一个接口上启用了 RSS。

如果输出缓冲区对于 RSS_SCALABILITY_INFO 结构不够大, (cbOutBuffer 小于 RSS_SCALABILITY_INFO) 或 lpvOutBuffer 参数为 NULL 指针, SOCKET_ERROR 将作为此 IOCTL 的结果返回, WSAGetLastError 返回 WSAEINVAL

在多个 CPU 驻留在单个系统中的高速网络中,网络协议堆栈在多 CPU 系统上良好缩放的能力受到抑制,因为 NDIS 5.1 和早期版本的体系结构将接收协议处理限制为单个 CPU。 接收方缩放 (RSS) 允许网络适配器的网络负载跨多个 CPU 进行均衡来解决此问题。

Windows Vista 及更高版本支持SIO_QUERY_RSS_SCALABILITY_INFO。

SIO_QUERY_TRANSPORT_SETTING (操作码设置:I、T==3)

查询套接字上的传输设置。 要查询的传输设置基于 lpvInBuffer 参数中传递的TRANSPORT_SETTING_ID

当前定义的唯一传输设置是 TCP 套接字上的 REAL_TIME_NOTIFICATION_CAPABILITY 功能。

如果 TRANSPORT_SETTING_IDGuid 成员设置为 REAL_TIME_NOTIFICATION_CAPABILITY,则这是一个请求,用于查询用于 在 Windows 应用商店应用中接收后台网络通知的 TCP 套接字的实时通知设置。 如果 WSAIoctlWSPIoctl 调用成功,则此 IOCTL 将返回具有当前状态 的REAL_TIME_NOTIFICATION_SETTING_OUTPUT 结构。

有关详细信息,请参阅 SIO_QUERY_TRANSPORT_SETTING 参考。 Windows 8、Windows Server 2012 及更高版本支持SIO_QUERY_TRANSPORT_SETTING。

SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE (操作码设置:O、T==3)

查询应用程序层强制 (ALE) 终结点句柄。

Windows 筛选平台 (WFP) 支持网络流量检查和修改。 在 Windows Vista 上,WFP 侧重于主机是通信终结点的方案。 但是,在 Windows Server 2008 上,有一些边缘防火墙实现希望利用 WFP 平台来检查和代理直通流量。 Internet 安全和加速 (ISA) 服务器就是此类边缘设备的一个示例。

某些防火墙方案可能需要将入站数据包注入到与现有终结点关联的发送路径。 需要有一种机制来发现与目标终结点关联的传输层终结点句柄。 创建终结点的应用程序拥有这些传输层终结点。 此 IOCTL 用于提供到传输层终结点句柄映射的套接字句柄。

如果输出缓冲区不足以满足终结点句柄 (cbOutBuffer 小于 UINT64) 或 lpvOutBuffer 参数为 NULL 指针, SOCKET_ERROR 作为此 IOCTL 的结果返回, WSAGetLastError 返回 WSAEINVAL

Windows Vista 及更高版本支持SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE。

SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT (操作码设置:I、T==3)

查询 Windows 筛选平台 (WFP) 重定向服务使用的重定向记录的重定向上下文。

SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL 用于在重定向的套接字连接上提供代理连接跟踪。 此 WFP 功能有助于跟踪从连接的初始重定向到目标的最终连接的重定向记录。

有关详细信息,请参阅 SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT 参考。 Windows 8、Windows Server 2012 及更高版本支持SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT。

SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS (操作码设置:I、T==3)

查询接受的 TCP/IP 连接的重定向记录,供 Windows 筛选平台 (WFP) 重定向服务使用。

SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL 用于在重定向的套接字连接上提供代理连接跟踪。 此 WFP 功能有助于跟踪从连接的初始重定向到目标的最终连接的重定向记录。

有关详细信息,请参阅 SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS 参考。 Windows 8、Windows Server 2012 及更高版本支持SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS。

SIO_RCVALL (操作码设置:I、T==3)

使套接字能够接收通过网络接口传递的所有 IPv4 或 IPv6 数据包。 传递给 WSAIoctl 函数的套接字句柄必须是下列项之一:

  • 创建的 IPv4 套接字,地址系列设置为 AF_INET,套接字类型设置为 SOCK_RAW,协议设置为 IPPROTO_IP。
  • 创建的 IPv6 套接字,地址系列设置为 AF_INET6,套接字类型设置为 SOCK_RAW,协议设置为 IPPROTO_IPV6。

套接字还必须绑定到显式本地 IPv4 或 IPv6 接口,这意味着无法绑定到 INADDR_ANYin6addr_any

在 Windows Server 2008 及更早版本中, SIO_RCVALL IOCTL 设置不会捕获从网络接口发出的本地数据包。 这包括在另一个接口上接收的数据包,并转发了为 SIO_RCVALL IOCTL 指定的网络接口。

在 Windows 7 和 Windows Server 2008 R2 上,已更改此设置,以便也捕获从网络接口发出的本地数据包。 这包括在另一个接口上接收的数据包,然后使用 SIO_RCVALL IOCTL 转发到套接字的网络接口。

设置此 IOCTL 需要本地计算机上的管理员权限。

此功能有时称为混杂模式。

SIO_RCVALL IOCTL 选项的可能值在 Mstcpip.h 头文件中定义的 RCVALL_VALUE 枚举中指定。 SIO_RCVALL的可能值如下所示:

术语 说明
RCVALL_OFF
禁用此选项,以便套接字不会接收网络上的所有 IPv4 或 IPv6 数据包。
RCVALL_ON
启用此选项,以便套接字接收网络上的所有 IPv4 或 IPv6 数据包。 如果 NIC 支持混杂模式,此选项在 NIC) 卡 (网络接口上启用混杂模式。 在具有网络中心的 LAN 网段上,支持混杂模式的 NIC 将捕获 LAN 上的所有 IPv4 或 IPv6 流量,包括同一 LAN 段中其他计算机之间的流量。 所有捕获的数据包 (IPv4 或 IPv6,具体取决于套接字) 将传递到原始套接字。
此选项不会捕获 (ARP、IPX 和 NetBEUI 数据包的其他数据包,例如接口上的) 。
Netmon 对网络接口使用相同的模式,但不使用此选项来捕获流量。
RCVALL_SOCKETLEVELONLY
此功能当前未实现,因此设置此选项没有任何影响。
RCVALL_IPLEVEL
启用此选项,以便 IPv4 或 IPv6 套接字在网络上的 IP 级别接收所有数据包。 此选项不会在网络接口卡上启用混杂模式。 此选项仅影响 IP 级别的数据包处理。 NIC 仍仅接收定向到其配置的单播和多播地址的数据包。 但是,启用此选项的套接字不仅会收到定向到特定 IP 地址的数据包,还会接收 NIC 接收的所有 IPv4 或 IPv6 数据包。
此选项不会捕获 (ARP、IPX 和 NetBEUI 数据包的其他数据包,例如接口上收到的) 。

有关详细信息,请参阅 SIO_RCVALL 参考。

windows 2000 及更高版本支持SIO_RCVALL。

SIO_RCVALL_IGMPMCAST (操作码设置:I、T==3)

使套接字能够接收网络上的所有 IGMP 多播 IP 流量,而无需接收其他多播 IP 流量。 传递给 WSAIoctl 函数的套接字句柄必须AF_INET地址系列、SOCK_RAW套接字类型和IPPROTO_IGMP协议。 套接字还必须绑定到显式本地接口,这意味着不能绑定到INADDR_ANY。

绑定套接字并设置 IOCTL 后,对 WSARecvrecv 函数的调用将返回通过给定接口的多播 IP 数据报。 请注意,必须提供足够大的缓冲区。 设置此 IOCTL 需要本地计算机上的管理员权限。

windows 2000 及更高版本支持SIO_RCVALL_IGMPMCAST。

SIO_RCVALL_MCAST (操作码设置:I、T==3)

使套接字能够接收网络上的所有多播 IP 流量 (,即发往 224.0.0.0 到 239.255.255.255) 范围内的 IP 地址的所有 IP 数据包。 传递给 WSAIoctl 函数的套接字句柄必须AF_INET地址系列、SOCK_RAW套接字类型和IPPROTO_UDP协议。 套接字还必须绑定到显式本地接口,这意味着不能绑定到INADDR_ANY。 套接字应绑定到端口零。

绑定套接字并设置 IOCTL 后,对 WSARecvrecv 函数的调用将返回通过给定接口的多播 IP 数据报。 请注意,必须提供足够大的缓冲区。 设置此 IOCTL 需要本地计算机上的管理员权限。

Windows 2000 及更高版本支持SIO_RCVALL_MCAST。

SIO_RELEASE_PORT_RESERVATION (操作码设置:I、T==3)

释放 TCP 或 UDP 端口块的运行时预留。 必须已使用 IOCTL SIO_ACQUIRE_PORT_RESERVATION 从颁发进程获取要释放的运行时预留。

有关更多详细信息,请参阅 SIO_RELEASE_PORT_RESERVATION 参考。

SIO_RELEASE_PORT_RESERVATION 在 Windows Vista 和更高版本的操作系统上受支持。

SIO_ROUTING_INTERFACE_CHANGE (opcode 设置:I、T==1)

若要接收路由接口更改的通知,该更改应用于访问输入缓冲区中的远程地址, (指定为 sockaddr 结构) 。 完成此 IOCTL 后,不会提供有关新路由接口的输出信息;完成仅指示给定目标的路由接口已更改,应使用 SIO_ROUTING_INTERFACE_QUERY IOCTL 进行查询。

假定应用程序使用重叠的 I/O 通过完成 SIO_ROUTING_INTERFACE_CHANGE 请求来通知路由接口更改(尽管不是必需的)。 或者,如果在非阻塞套接字上发出 SIO_ROUTING_INTERFACE_CHANGE IOCTL,且 lpOverlappedlpCompletionRoutine 参数设置为 NULL) ,它将立即完成返回和 WSAEWOULDBLOCK 作为错误,然后应用程序可以通过调用 WSAEventSelectWSAAAsyncSelect 来等待路由更改事件,并在网络事件位掩码中设置了FD_ROUTING_INTERFACE_CHANGE位。

人们认识到,路由信息在大多数情况下保持稳定,因此要求应用程序保留多个未完成的 IOCTL 以获取有关它感兴趣的所有目标的通知,以及让服务提供商跟踪这些通知请求将占用大量系统资源。 可以通过扩展输入参数的含义和放宽服务提供商要求来避免这种情况,如下所示:

  • 应用程序可以指定协议系列特定的通配符地址 (请求 绑定到 任何可用地址时绑定调用中使用的通配符地址) 请求任何路由更改的通知。 这允许应用程序为所有套接字和目标保留一个未完成 的SIO_ROUTING_INTERFACE_CHANGE ,然后使用 SIO_ROUTING_INTERFACE_QUERY 获取实际的路由信息。
  • 服务提供商可以选择忽略 应用程序在SIO_ROUTING_INTERFACE_CHANGE (输入缓冲区中指定的信息,就像应用程序) 指定通配符地址一样,并在发生任何路由信息更改时完成 SIO_ROUTING_INTERFACE_CHANGE IOCTL 或信号FD_ROUTING_INTERFACE_CHANGE事件 (而不仅仅是到输入缓冲区) 中指定的目标的路由。

SIO_ROUTING_INTERFACE_QUERY (操作码设置:I、O、T==1)

若要获取本地接口的地址, (表示为 sockaddr 结构) 应用于发送到输入缓冲区中指定的远程地址 (sockaddr) 。 可以在输入缓冲区中提交远程多播地址,以获取多播传输的首选接口的地址。 在任何情况下,应用程序都可以在后续绑定 () 请求中使用返回的接口地址。

请注意,路由可能会更改。 因此,应用程序不能依赖于 SIO_ROUTING_INTERFACE_QUERY 返回的信息是永久性的。 应用程序可以通过 SIO_ROUTING_INTERFACE_CHANGE IOCTL 注册路由更改通知,该 IOCTL 通过重叠 I/O 或FD_ROUTING_INTERFACE_CHANGE事件提供通知。 以下操作序列可用于保证应用程序始终具有给定目标的当前路由接口信息:

  • IOCTL SIO_ROUTING_INTERFACE_CHANGE 问题
  • IOCTL SIO_ROUTING_INTERFACE_QUERY 问题
  • 每当 SIO_ROUTING_INTERFACE_CHANGE IOCTL 通过重叠 I/O 或通过FD_ROUTING_INTERFACE_CHANGE事件) 发出信号来通知路由更改 (应用程序时,应重复整个操作序列。

如果输出缓冲区的大小不足以包含接口地址,SOCKET_ERROR将作为此 IOCTL 的结果返回, WSAGetLastError 将返回 WSAEFAULT。 在本例中,输出缓冲区的所需大小将以 l 返回。 请注意,如果 lpvInBufferlpvOutBufferlBytesReturned 参数未完全包含在用户地址空间的有效部分中,也会返回 WSAEFAULT 错误代码。

如果无法通过任何可用接口访问输入缓冲区中指定的目标地址,则此 IOCTL 的结果返回SOCKET_ERROR,如果所有网络连接丢失, WSAGetLastError 将返回 WSAENETUNREACH 甚至 WSAENETDOWN

SIO_SET_COMPATIBILITY_MODE (操作码设置:I、T==3)

请求网络堆栈应如何处理某些行为,这些行为的默认处理方式可能因 Windows 版本而异。 SIO_SET_COMPATIBILITY_MODE 的参数结构是在 Mswsockdef.h 头文件中定义的 WSA_COMPATIBILITY_MODE 结构中指定的。 此结构定义如下:

/* Argument structure for SIO_SET_COMPATIBILITY_MODE */
typedef struct _WSA_COMPATIBILITY_MODE {
    WSA_COMPATIBILITY_BEHAVIOR_ID BehaviorId;
    ULONG TargetOsVersion;
} WSA_COMPATIBILITY_MODE, *PWSA_COMPATIBILITY_MODE;

BehaviorId 成员中指定的值指示请求的行为。 TargetOsVersion 成员中指定的值指示正在为该行为请求的 Windows 版本。

BehaviorId 成员可以是 mswsockdef.h 头文件中定义的 WSA_COMPATIBILITY_BEHAVIOR_ID 枚举类型的值之一。 BehaviorId 成员的可能值如下所示。

术语 说明
WsaBehaviorAll
这等效于请求为 WSA_COMPATIBILITY_BEHAVIOR_ID 定义的所有可能的兼容行为。
WsaBehaviorReceiveBuffering
TargetOsVersion 成员设置为 Windows Vista 或更高版本的值时,即使已建立 TCP 连接,也允许使用 SO_RCVBUF 套接字选项减少此套接字上的 TCP 接收缓冲区大小。
如果将 TargetOsVersion 成员设置为早于 Windows Vista 的值,则不允许在建立连接后使用 SO_RCVBUF 套接字选项减小此套接字上的 TCP 接收缓冲区大小。
WsaBehaviorAutoTuning
TargetOsVersion 成员设置为 Windows Vista 或更高版本的值时,将启用接收窗口自动优化,TCP 窗口比例系数从默认值 8 降至 2。
TargetOsVersion 设置为早于 Windows Vista 的值时,将禁用接收窗口自动优化。 TCP 窗口缩放选项也处于禁用状态,最大 true 接收窗口大小限制为 65,535 字节。 即使在此套接字上调用了 SO_RCVBUF 套接字选项,在建立连接之前指定大于 65,535 字节的值,也无法在连接上协商 TCP 窗口缩放选项。

有关详细信息,请参阅 SIO_SET_COMPATIBILITY_MODE 参考。

Windows Vista 及更高版本支持SIO_SET_COMPATIBILITY_MODE。

SIO_SET_GROUP_QOS (操作码设置:I、T==1)

保留。

SIO_SET_PRIORITY_HINT (操作码设置:I、T==3)

为基础传输协议提供一个提示,以特定优先级处理此套接字上的流量。 lpvInBuffer 必须指向类型为 PRIORITY_HINT 的变量,并将 cbInBuffer 设置为 sizeof (PRIORITY_HINT) 。 lpvOutBuffercbOutBuffer 参数必须分别为 NULL 和 0。 Microsoft Windows TCP 实现从 Windows 10 版本 1809 (10.0 开始支持此 IOCTL;内部版本 17763) 及更高版本,如下所示:当请求的优先级值设置为 IoPriorityHintVeryLow 时,TCP 使用 RFC 6817) 中定义的 LEDBAT 算法的修改版本 (来控制套接字上的出站流量速率。 入站流量不受此 IOCTL 影响。 LEDBAT 是一种清除器算法,其目标是保持较低的延迟,并通过在正常优先级流量存在时退出来防止对正常优先级流量产生任何不利影响。

另请参阅 RFC 6817

Windows 10 版本 1809 ( 10.0 支持SIO_SET_PRIORITY_HINT;内部版本 17763) 及更高版本。

SIO_SET_QOS (操作码设置:I、T==1)

将指定的 QOS 结构与套接字相关联。 不需要输出缓冲区,将从输入缓冲区获取 QOS 结构。 WSAENOPROTOOPT 错误代码指示为不支持服务质量的服务提供商。

SIO_TCP_INITIAL_RTO (操作码设置:I、T==3)

通过配置初始重新传输超时 (RTO) 参数来控制 TCP 套接字的初始 (SYN/SYN+ACK) 重新传输特征。 配置参数在 TCP_INITIAL_RTO_PARAMETERS 结构中指定。

有关详细信息,请参阅 SIO_TCP_INITIAL_RTO 参考。 Windows 8、Windows Server 2012 及更高版本支持SIO_TCP_INITIAL_RTO。

SIO_TIMESTAMPING

用于配置套接字传输/接收时间戳的接收的套接字 IOCTL。 仅对数据报套接字有效。 SIO_TIMESTAMPING的输入类型是TIMESTAMPING_CONFIG结构。

另请参阅 Winsock 时间戳

SIO_TRANSLATE_HANDLE (操作码设置:I、O、T==1)

若要获取在配套接口的上下文中 有效的相应句 柄, (例如,TH_NETDEV 和 TH_TAPI) 。 在输入缓冲区中指定标识配套接口的清单常量以及任何其他所需参数。 完成此函数后,输出缓冲区中将提供相应的句柄。 有关特定于特定配套接口的详细信息,请参阅 Winsock 附件 中的相应部分。 对于不支持指定配套接口的此 IOCTL 的服务提供商,指示 WSAENOPROTOOPT 错误代码。 此 IOCTL 使用 SIO_TRANSLATE_HANDLE 检索关联的句柄。

建议使用组件对象模型 (COM) 而不是此 IOCTL 来发现和跟踪套接字可能支持的其他接口。 此 IOCTL 用于与 COM 不可用或因其他原因无法使用的系统向后兼容。

SIO_UDP_CONNRESET (操作码设置:I、T==3)

Windowsxp: 控制是否报告 UDP PORT_UNREACHABLE消息。 设置为 TRUE 以启用报告。 设置为 FALSE 可禁用报告。

SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS (操作码设置:I、T==3)

将重定向记录设置为用于连接到最终目标的新 TCP 套接字,供 Windows 筛选平台 (WFP) 重定向服务使用。

SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL 用作重定向套接字连接上代理连接跟踪的一部分。 此 WFP 功能有助于跟踪从连接的初始重定向到目标的最终连接的重定向记录。

有关更多详细信息,请参阅 SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS 参考。 Windows 8、Windows Server 2012 及更高版本支持SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS。

SIO_TCP_INFO (操作码设置:I、O、T==3)

检索套接字的 TCP 统计信息。 TCP 统计信息以 TCP_INFO_v0 结构提供。

与使用 GetPerTcpConnectionEStats 函数检索 TCP 统计信息不同,使用此控制代码检索 TCP 统计信息不需要用户代码来加载、存储和筛选 TCP 连接表,也不需要使用提升的权限。

有关详细信息,请参阅 SIO_TCP_INFOWindows 10版本 1703、Windows Server 2016 及更高版本支持SIO_TCP_INFO。

备注

Winsock Ioctls 在许多不同的头文件中定义。 其中包括 Winsock2.hMswsock.hMstcpip.h 头文件。

在为 Windows Vista 及更高版本发布的 Microsoft Windows 软件开发工具包 (SDK) 中,头文件的组织已更改,并且 Ws2def.hWs2ipdef.hMswsockdef.h 头文件中也定义了许多 Winsock Ioctls。 Ws2def.h 头文件将自动包含在 Winsock2.h 头文件中。 Ws2ipdef.h 头文件自动包含在 Ws2tcpip.h 头文件中。 Mswsockdef.h 头文件将自动包含在 Mswsockdef.h 头文件中。

要求

要求
标头
Winsock2.h;
Mstcpip.h;
Mswsock.h;
Windows Vista、Windows Server 2008 和 Windows 7 上的 Mswsockdef.h (包括 Mswsock.h) ;
Windows Vista、Windows Server 2008 和 Windows 7 上的 Ws2def.h (包括 Winsock2.h) ;
Windows Vista、Windows Server 2008 和 Windows 7 上的 Ws2ipdef.h (包括 Ws2tcpip.h)