LPWSPIOCTL 回调函数 (ws2spi.h)
LPWSPIoctl 函数控制套接字的模式。
语法
LPWSPIOCTL Lpwspioctl;
int Lpwspioctl(
[in] SOCKET s,
[in] DWORD dwIoControlCode,
[in] LPVOID lpvInBuffer,
[in] DWORD cbInBuffer,
[out] LPVOID lpvOutBuffer,
[in] DWORD cbOutBuffer,
[out] LPDWORD lpcbBytesReturned,
[in] LPWSAOVERLAPPED lpOverlapped,
[in] LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
[in] LPWSATHREADID lpThreadId,
[in] LPINT lpErrno
)
{...}
参数
[in] s
标识套接字的描述符。
[in] dwIoControlCode
要执行的操作的控制代码。
[in] lpvInBuffer
指向输入缓冲区的指针。
[in] cbInBuffer
输入缓冲区的大小(以字节为单位)。
[out] lpvOutBuffer
指向输出缓冲区的指针。
[in] cbOutBuffer
输出缓冲区的大小(以字节为单位)。
[out] lpcbBytesReturned
指向实际输出字节数的指针。
[in] lpOverlapped
对于非重叠套接字) , (忽略指向 WSAOverlapped 结构的指针。
[in] lpCompletionRoutine
类型:_In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
指向完成操作时调用的完成例程的指针, (忽略非重叠套接字) 。 请参阅“备注”。
[in] lpThreadId
指向 WSATHREADID 结构的指针,供提供程序在后续调用 WPUQueueApc 时使用。 在 WPUQueueApc 函数返回之前,提供程序应存储引用的 WSATHREADID 结构 (而不是指针) 。
[in] lpErrno
指向错误代码的指针。
返回值
如果未发生任何错误,并且操作已立即完成, 则 LPWSPIoctl 返回零。 请注意,在这种情况下,完成例程(如果指定)已排队。 否则,将返回值 SOCKET_ERROR,并且 lpErrno 中提供了特定的错误代码。 错误代码WSA_IO_PENDING指示已成功启动重叠操作,稍后将指示完成。 任何其他错误代码指示未启动重叠操作,也不会发生完成指示。
错误代码 | 含义 |
---|---|
已成功启动重叠操作,稍后将指示完成。 |
|
lpvInBuffer、lpvOutBuffer 或 lpvBytesReturned 参数未完全包含在用户地址空间的有效部分,或者 cbInBuffer 或 cbOutBuffer 参数太小。 |
|
dwIoControlCode 不是有效的命令,或者提供的输入参数不可接受,或者命令不适用于提供的套接字类型。 |
|
回调正在进行时调用 函数。 |
|
网络子系统发生故障。 |
|
描述符 s 不是套接字。 |
|
无法实现指定的 IOCTL 命令。 例如,无法满足 SIO_SET_QOS 中指定的流规范。 |
|
:套接字标记为非阻止,请求的操作会进行阻止。 |
注解
此例程用于设置或检索与套接字、传输协议或通信子系统关联的操作参数。 如果 lpOverlapped 和 lpCompletionRoutine 均为 NULL,则此函数中的套接字将被视为非重叠套接字。
对于非重叠套接字, 将忽略 lpOverlapped 和 lpCompletionRoutine 参数, 如果套接字 处于 阻止模式,则此函数可能会阻止。 请注意, 如果套接字 处于 非阻止模式,则如果无法立即完成指定的操作,此函数可以返回 WSAEWOULDBLOCK 。 在这种情况下,Windows 套接字 SPI 客户端可能会将套接字更改为阻止模式,并重新发出请求或等待相应的网络事件 ((如FD_ROUTING_INTERFACE_CHANGE或FD_ADDRESS_LIST_CHANGE),以防SIO_ROUTING_INTERFACE_CHANGE或SIO_ADDRESS_LIST_CHANGE) 使用 LPWSPAsyncSelect 或事件 (使用 LPWSPEventSelect) 通知机制 (。
对于重叠的套接字,将启动无法立即完成的操作,稍后会指示完成。 可以忽略返回的 lBytesReturned 参数指向的 DWORD 值。 当操作完成时发出相应的完成方法信号时,可以检索返回的最终完成状态和返回的字节。
任何 IOCTL 都可能会无限期阻止,具体取决于服务提供商的实现。 如果 Windows 套接字 SPI 客户端不能容忍 在 LPWSPIoctl 调用中阻止,建议对最有可能阻止的 IOCTL 使用重叠 I/O,包括:
- SIO_ADDRESS_LIST_CHANGE
- SIO_FINDROUTE
- SIO_FLUSH
- SIO_GET_QOS
- SIO_GET_GROUP_QOS
- SIO_ROUTING_INTERFACE_CHANGE
- SIO_SET_QOS
- SIO_SET_GROUP_QOS
某些特定于协议的 IOCTL 也可能特别可能阻止。 有关可用信息,请查看特定于协议的相关附件。
lpCompletionRoutine 参数指向的完成例程的原型如下所示。
void CALLBACK
CompletionRoutine(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);
CompletionRoutine 是应用程序提供的函数名称的占位符。 dwError 参数指定重叠操作的完成状态,如 lpOverlapped 参数所示。 cbTransferred 参数指定接收的字节数。 dwFlags 参数不用于此 IOCTL。 完成例程不返回值。
在 dwIoControlCode 参数现在是 32 位实体的情况下,可以采用一种编码方案,该编码方案提供了对 opcode 标识符空间进行分区的便捷方法。 dwIoControlCode 参数的构造是为了在添加新控制代码时允许协议和供应商独立性,同时保持与 Windows 套接字 1.1 和 UNIX 控制代码的向后兼容性。 dwIoControlCode 参数具有以下形式。
bit 31 | 位 30 | 位 29 | 位 28 和 27 | bits 26 到 16 | bits 15 到 0 |
---|---|---|---|---|---|
I | O | V | T | 供应商/地址系列 | 代码 |
如果输入缓冲区对代码有效,则设置 I,如IOC_IN。
如果输出缓冲区对代码有效,则设置 O,如IOC_OUT。 请注意,对于同时具有输入和输出参数的代码,将设置 I 和 O 。
如果代码没有参数,则设置 V,如IOC_VOID。
T 是定义 IOCTL 类型的两位数量。 定义了以下值。
- 0 表示 IOCTL 是标准的 UNIX IOCTL 代码,与 FIONREAD、 FIONBIO 等一样。
- 1 表示 IOCTL 是通用 Windows 套接字 2 IOCTL 代码。 为 Windows 套接字 2 定义的新 IOCTL 代码将具有 T == 1。
- 2 指示 IOCTL 仅适用于特定地址系列。
- 3 IOCTL 仅适用于特定供应商的提供程序。 此类型允许为公司分配显示在 供应商/地址系列 成员中的供应商编号。 然后,供应商可以定义特定于该供应商的新 IOCTL,而无需向清算所注册 IOCTL,从而提供供应商的灵活性和隐私性。
供应商/地址系列 是一个 11 位数量,它定义在 T == 3) 时拥有代码 (的供应商,或包含代码 ((如果 T == 2) )应用到的地址系列。 如果这是 (T == 0) 的 UNIX IOCTL 代码,则此成员的值与 UNIX 上的代码相同。 如果这是泛型 Windows 套接字 2 IOCTL (T == 1) 则此成员可用作代码成员的扩展来提供其他代码值。
代码 是操作的特定 IOCTL 代码。
支持以下 UNIX 命令:
-
FIONBIO
-
启用或禁用 套接字上的非阻止模式。 lpvInBuffer 参数指向无符号长,如果要启用非阻止模式,则为非零,如果要禁用该模式,则为零。 创建套接字时,它将在阻止模式下运行, (即) 禁用非阻止模式。 这与 Berkeley Software Distribution (BSD) 套接字一致。
LPWSPAsyncSelect 或 LPWSPEventSelect 例程会自动将套接字设置为非阻止模式。 如果已在套接字上发出 LPWSPAsyncSelect 或 LPWSPEventSelect ,则任何使用 LPWSPIoctl 将套接字重新设置为阻止模式的尝试都将失败,并出现 WSAEINVAL。 若要将套接字重新设置为阻止模式,Windows 套接字 SPI 客户端必须先通过调用 LPWSPAsyncSelect(lEvent 参数等于零)来禁用 LPWSPAsyncSelect,或者通过调用 LPWSPEventSelect(lNetworkEvents 参数等于零)来禁用 LPWSPEventSelect。
-
FIONREAD
-
确定 可从套接字以原子方式读取的数据量。 lpvOutBuffer 参数指向 WSAIoctl 存储结果的无符号长。
如果 s 参数中 传递的套接字面向流 (例如,类型SOCK_STREAM) , 则 FIONREAD 返回可在单个接收操作中读取的数据总量;这通常与套接字 (上排队的数据总量相同,因为数据流是面向字节的,因此不能保证) 。
如果 s 参数中传递的套接字面向消息 (例如,类型SOCK_DGRAM) , 则 FIONREAD 将返回报告可供读取的总字节数,而不是在套接字上排队的第一个数据报 (消息) 的大小。
-
SIOCATMARK
-
确定是否已读取所有 OOB 数据。 这仅适用于流样式 (的套接字,例如,已配置为内联接收任何 OOB 数据 (SO_OOBINLINE) 的类型SOCK_STREAM) 。 如果没有 OOB 数据正在等待读取,则操作返回 TRUE。 否则,它将返回 FALSE,对套接字执行的下一个接收操作将检索标记前面的部分或全部数据;Windows 套接字 SPI 客户端应使用 SIOCATMARK 操作来确定是否有任何剩余项。 如果在紧急 (OOB) 数据之前有任何正常数据,则会按顺序接收数据。 (请注意,接收操作永远不会在同一 call.) lpvOutBuffer 点(LPWSPIoctl 存储结果)的 BOOL 中混合 OOB 和正常数据。
支持以下 Windows 套接字 2 命令:
-
SIO_ACQUIRE_PORT_RESERVATION (操作码设置:I、T==3)
-
请求 TCP 或 UDP 端口块的运行时预留。 对于运行时端口预留,端口池要求从向其授予预留的套接字的进程使用预留。 运行时端口预留的持续时间仅为调用 SIO_ACQUIRE_PORT_RESERVATION IOCTL 的套接字的生存期。 相比之下,使用 CreatePersistentTcpPortReservation 或 CreatePersistentUdpPortReservation 函数创建的永久性端口预留可由能够获取永久性预留的任何进程使用。
有关详细信息,请参阅 SIO_ACQUIRE_PORT_RESERVATION 参考。
windows Vista 和更高版本的操作系统支持SIO_ACQUIRE_PORT_RESERVATION。
-
SIO_ADDRESS_LIST_CHANGE (操作码设置:T==1)
-
接收 Windows 套接字 SPI 客户端可以绑定到的套接字协议系列本地传输地址列表中发生更改的通知。 完成此 IOCTL 后,不会提供任何输出信息;完成仅指示可用本地地址列表已更改,应通过 SIO_ADDRESS_LIST_QUERY再次查询。
假定 (虽然不是必需的) Windows 套接字 SPI 客户端使用重叠的 I/O 通过完成 SIO_ADDRESS_LIST_CHANGE 请求来收到更改的通知。 或者,如果在非阻塞套接字上发出 SIO_ADDRESS_LIST_CHANGE IOCTL,并且没有重叠参数 (lpOverlapped 和 lpCompletionRoutine 设置为 NULL) ,它将立即完成,并出现错误 WSAEWOULDBLOCK。 然后,Windows 套接字 SPI 客户端可以通过调用 LPWSPEventSelect 或 LPWSPAsyncSelect 来等待地址列表更改事件,并在网络事件位掩码中设置了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 问题
- 问题 SIO_ADDRESS_LIST_QUERY IOCTL
- 每当 SIO_ADDRESS_LIST_CHANGE IOCTL 通过重叠的 I/O 或通过) FD_ADDRESS_LIST_CHANGE事件 (通知地址列表更改的应用时,应重复整个操作序列。
有关详细信息,请参阅 SIO_ADDRESS_LIST_QUERY 参考。 windows 2000 及更高版本支持SIO_ADDRESS_LIST_QUERY。
-
SIO_ASSOCIATE_HANDLE (操作码设置:I、T==1)
-
将此套接字与配套接口的指定句柄相关联。 输入缓冲区包含对应于配套接口 (清单常量(例如,TH_NETDEV 和 TH_TAPI) )的整数值,后跟指定配套接口的句柄的值,以及任何其他必需的信息。 有关其他详细信息,请参阅 Windows 套接字 2 Protocol-Specific 附件 和/或文档中的相应部分,了解特定配套接口。 (这些资源可能仅以英语提供。) 总大小反映在输入缓冲区长度中。 不需要输出缓冲区。 对于不支持此 IOCTL 的服务提供商,指示 WSAENOPROTOOPT 错误代码。 可以使用 SIO_TRANSLATE_HANDLE 检索此 IOCTL 关联的句柄。
可以使用配套接口,例如,如果特定提供程序提供:
- 对套接字行为的大量额外控制。
- 不映射到现有 Windows 套接字函数的提供程序特定控件 (或将来可能) 的控件。
建议使用组件对象模型 (COM) 代替此 IOCTL,以发现并跟踪套接字可能支持的其他接口。 存在此 IOCTL 是为了与 COM 不可用或因其他原因而无法使用的系统向后兼容。
-
SIO_ASSOCIATE_PORT_RESERVATION (操作码设置:I、T==3)
-
将套接字与由端口预留令牌标识的 TCP 或 UDP 端口块的持久性或运行时预留相关联。 在绑定套接字之前,必须发出 SIO_ASSOCIATE_PORT_RESERVATION IOCTL。 如果和当套接字绑定时,将从给定令牌标识的端口预留中选择分配给它的端口。 如果指定的预留中没有可用的端口, 则 Bind 函数调用将失败。
有关详细信息,请参阅 SIO_ASSOCIATE_PORT_RESERVATION 参考。
windows Vista 和更高版本的操作系统支持SIO_ASSOCIATE_PORT_RESERVATION。
-
SIO_BASE_HANDLE (操作码设置:O、T==1)
-
检索给定套接字的基本服务提供程序句柄。 返回的值为 SOCKET。
分层服务提供程序绝不应截获此 IOCTL,因为返回值必须是来自基本服务提供程序的套接字句柄。
如果输出缓冲区不足以容纳套接字句柄 (cbOutBuffer 小于 SOCKET) 或 lpvOutBuffer 参数为 NULL 指针, SOCKET_ERROR 作为此 IOCTL 的结果返回, WSAGetLastError 返回 WSAEFAULT。
SIO_BASE_HANDLE 在 Mswsock.h 头文件中定义,并在 Windows Vista 及更高版本上受支持。
-
SIO_BSP_HANDLE (操作码设置:O、T==1)
-
检索 WSASendMsg 函数使用的套接字的基本服务提供程序句柄。 返回的值为 SOCKET。
分层服务提供程序使用此 Ioctl 来确保提供程序截获 WSASendMsg 函数。
如果输出缓冲区不足以容纳套接字句柄 (cbOutBuffer 小于 SOCKET) 或 lpvOutBuffer 参数为 NULL 指针, SOCKET_ERROR 作为此 IOCTL 的结果返回, WSAGetLastError 返回 WSAEFAULT。
SIO_BSP_HANDLE 在 Mswsock.h 头文件中定义,并在 Windows Vista 及更高版本上受支持。
-
SIO_BSP_HANDLE_SELECT (操作码设置:O、T==1)
-
检索 select 函数使用的套接字的基本服务提供程序句柄。 返回的值为 SOCKET。
分层服务提供程序使用此 Ioctl 来确保提供程序截获 select 函数。
如果输出缓冲区不足以容纳套接字句柄 (cbOutBuffer 小于 SOCKET) 或 lpvOutBuffer 参数为 NULL 指针, SOCKET_ERROR 作为此 IOCTL 的结果返回, WSAGetLastError 返回 WSAEFAULT。
SIO_BSP_HANDLE_SELECT 在 Mswsock.h 头文件中定义,并在 Windows Vista 及更高版本上受支持。
-
SIO_BSP_HANDLE_POLL (操作码设置:O、T==1)
-
检索 WSAPoll 函数使用的套接字的基本服务提供程序句柄。 lpOverlapped 参数必须是 NULL 指针。 返回的值为 SOCKET。
分层服务提供程序使用此 Ioctl 来确保提供程序截获 WSAPoll 函数。
如果输出缓冲区不足以容纳套接字句柄 (cbOutBuffer 小于 SOCKET) 的大小, 则 lpvOutBuffer 参数为 NULL 指针,或 lpOverlapped 参数不是 NULL 指针, SOCKET_ERROR 将作为此 IOCTL 的结果返回, WSAGetLastError 返回 WSAEFAULT。
SIO_BSP_HANDLE_POLL 在 Mswsock.h 头文件中定义,并在 Windows Vista 及更高版本上受支持。
-
SIO_CHK_QOS (操作码设置:I、O、T==3)
-
检索有关 QoS 流量特征的信息。 在发送系统在流设置和收到 RESV 消息之间的过渡阶段 (请参阅 RSVP 服务如何调用 TC,了解有关过渡阶段) 的详细信息,与 RSVP 流关联的流量根据服务类型 ( BEST EFFORT、CONTROLLED LOAD 或 GUARANTEED) 来调整。 有关详细信息,请参阅平台软件开发工具包 (SDK) 的“服务质量”部分中的“使用SIO_CHK_QOS”。
-
SIO_ENABLE_CIRCULAR_QUEUEING (操作码设置:V、T==1)
-
向面向消息的服务提供程序指示不应由于缓冲区队列溢出而删除新到达的消息。 相反,应消除队列中最早的消息,以便容纳新到达的消息。 不需要输入和输出缓冲区。 请注意,此 IOCTL 仅适用于与不可靠的面向消息的协议关联的套接字。 对于不支持此 IOCTL 的服务提供商,指示 WSAENOPROTOOPT 错误代码。
-
SIO_FIND_ROUTE (操作码设置:O、T==1)
-
发出后,此 IOCTL 请求发现到指定为输入缓冲区中 sockaddr 的 远程地址的路由。 如果地址已存在于本地缓存中,则其条目将失效。 对于 Novell 的 IPX,此调用会启动 IPX GetLocalTarget (GLT) ,该 IPX GetLocalTarget 在网络中查询给定的远程地址。
-
SIO_FLUSH (操作码设置:V、T==1)
-
放弃与此套接字关联的发送队列的当前内容。 不需要输入和输出缓冲区。 对于不支持此 IOCTL 的服务提供商,指示 WSAENOPROTOOPT 错误代码。
-
SIO_GET_BROADCAST_ADDRESS (操作码设置:O、T==1)
-
此 IOCTL 使用 sockaddr 结构填充输出缓冲区,该结构包含适合用于 LPWSPSendTo 的广播地址。
-
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、T==1)
-
保留。
-
SIO_GET_INTERFACE_LIST (操作码设置:O、T==0)
-
以 INTERFACE_INFO 结构的数组的形式返回已配置的 IP 接口及其参数的列表。
注意
对于符合 Windows 套接字 2 的 TCP/IP 服务提供商,必须支持此命令。
lpvOutBuffer 参数指向缓冲区,该缓冲区将有关接口的信息存储为接口上单播 IP 地址的INTERFACE_INFO结构数组。 cbOutBuffer 参数指定输出缓冲区的长度。 返回的接口数 (lpvOutBuffer 参数) 指向的缓冲区中返回的结构数,可以根据 l) BytesReturned 参数中返回的输出缓冲区的实际长度来确定。
如果使用 SIO_GET_INTERFACE_LIST 调用 WSAIoctl 函数,并且套接字参数的级别成员未定义为IPPROTO_IP,则返回 WSAEINVAL。 如果指定输出缓冲区长度的 cbOutBuffer 参数太小,则使用 SIO_GET_INTERFACE_LIST 调用 WSAIoctl 函数将返回 WSAEFAULT。
-
SIO_GET_INTERFACE_LIST_EX (操作码设置:O、T==0)
-
保留以供将来与套接字一起使用。
以 INTERFACE_INFO_EX 结构的数组的形式返回已配置的 IP 接口及其参数的列表。
lpvOutBuffer 参数指向缓冲区,该缓冲区将接口相关信息存储为接口上单播 IP 地址的INTERFACE_INFO_EX结构数组。 cbOutBuffer 参数指定输出缓冲区的长度。 返回的接口数 (lpvOutBuffer) 中返回的结构数可以基于 l) bytesReturned 参数中返回的输出缓冲区的实际长度来确定。
windows 当前不支持SIO_GET_INTERFACE_LIST_EX。
-
SIO_GET_QOS (操作码设置:O、T==1)
-
检索与套接字关联的 QOS 结构。 输入缓冲区是可选的。 例如,某些协议 (RSVP) 允许使用输入缓冲区来限定 QOS 请求。 QOS 结构将复制到输出缓冲区中。 输出缓冲区的大小必须足够大,才能包含完整的 QOS 结构。 WSAENOPROTOOPT 错误代码指示为不支持服务质量的服务提供商。
-
SIO_IDEAL_SEND_BACKLOG_CHANGE (操作码设置:V、T==0)
-
当基础连接的理想发送积压工作 (ISB) 值更改时,通知应用程序。
使用 Windows 套接字通过 TCP 连接发送数据时,请务必在 TCP 中 (发送但尚未确认) 保留足够的未完成数据量,以实现最高吞吐量。 为 TCP 连接实现最佳吞吐量而未完成的数据量的理想值称为 (ISB) 大小的理想发送积压工作。 ISB 值是 TCP 连接的带宽延迟乘积和接收方播发的接收窗口 (以及网络) 中部分拥塞量的函数。
每个连接的 ISB 值可从 Windows Server 2008、Windows Vista with Service Pack 1 (SP1) 及更高版本的操作系统中的 TCP 协议实现中获取。 SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL 可由应用程序用于在连接中的 ISB 值动态更改时获取通知。
有关详细信息,请参阅 SIO_IDEAL_SEND_BACKLOG_CHANGE 参考。
SIO_IDEAL_SEND_BACKLOG_CHANGE 在 Windows Server 2008、Windows Vista SP1 和更高版本的操作系统上受支持。
-
SIO_IDEAL_SEND_BACKLOG_QUERY (操作码设置: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、Windows Vista SP1 及更高版本的操作系统上受支持。
-
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 保持连接,可以使用 SO_KEEPALIVE 选项调用 getsockopt 函数。 若要启用或禁用 TCP 保持连接,可以使用 SO_KEEPALIVE 选项调用 setsockopt 函数。 如果使用 SO_KEEPALIVE 启用 TCP 保持连接,则默认 TCP 设置用于保持连接超时和间隔,除非已使用 SIO_KEEPALIVE_VALS 更改这些值。
有关详细信息,请参阅 SIO_KEEPALIVE_VALS 参考。 windows 2000 及更高版本支持SIO_KEEPALIVE_VALS。
-
SIO_MULTIPOINT_LOOPBACK (操作码设置:I,T==1)
-
控制本地计算机上的应用程序发送的数据是否 (不一定由多播会话中的同一套接字) 接收,该套接字联接到环回接口上的多播目标组。 值为 TRUE 会导致本地计算机上的应用程序发送的多播数据传递到环回接口上的侦听套接字。 值为 FALSE 会阻止将本地计算机上的应用程序发送的多播数据传递到环回接口上的侦听套接字。 默认情况下, SIO_MULTIPOINT_LOOPBACK 处于启用状态。
-
SIO_MULTICAST_SCOPE (操作码设置:I、T==1)
-
指定多播传输的范围。 范围定义为要涵盖的路由网段数。 范围为零表示多播传输不会放置在网络上,但可以跨本地主机内的套接字传播。 范围值 1 (默认) 指示传输将放置在线路上,但不会跨越任何路由器。 范围值越大,确定可交叉的路由器数。 请注意,这对应于 IP 多播中的生存时间 (TTL) 参数。
-
SIO_QUERY_RSS_SCALABILITY_INFO (操作码设置:O、T==3)
-
接收方缩放 (RSS) 功能的查询卸载接口。 为 SIO_QUERY_RSS_SCALABILITY_INFO 返回的参数结构在 Mstcpip.h 头文件中定义的 RSS_SCALABILITY_INFO 结构中指定。 此结构定义如下。
void CALLBACK CompletionRoutine( IN DWORD dwError, IN DWORD cbTransferred, IN LPWSAOVERLAPPED lpOverlapped, IN DWORD dwFlags );
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_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_PNP_TARGET_HANDLE (操作码设置:O、T==1)
-
获取当前套接字在 PnP 意义上所依赖的链中下一个提供程序的套接字描述符。 此 IOCTL 仅在通过 WPUCreateSocketHandle 调用创建的非 IFS 服务提供程序的套接字上由 Windows 套接字 2 DLL 调用。 提供程序应在输出缓冲区中返回给定套接字句柄在 PnP 感知中依赖的链中下一个提供程序的套接字句柄 (例如,删除支持基础句柄的设备将导致链) 中其上方的句柄失效。
如果重叠操作立即完成,则此函数将返回值零,并且 lBytesReturned 参数将更新为输出缓冲区中的字节数。 如果重叠操作已成功启动并在稍后完成,则此函数将返回SOCKET_ERROR并指示错误代码WSA_IO_PENDING。 在本例中, 不会更新lBytesReturned 。 重叠操作完成后,输出缓冲区中的数据量将通过完成例程中的 cbTransferred 参数 ((如果指定) )或通过 LPWSPGetOverlappedResult 中的 lcbTransfer 参数指示。
-
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_ANY 或 in6addr_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_RELEASE_PORT_RESERVATION (操作码设置:I、T==3)
-
释放 TCP 或 UDP 端口块的运行时预留。 要释放的运行时预留必须已使用 SIO_ACQUIRE_PORT_RESERVATION IOCTL 从颁发进程获取。
有关更多详细信息,请参阅 SIO_RELEASE_PORT_RESERVATION 参考。
windows Vista 和更高版本的操作系统支持SIO_RELEASE_PORT_RESERVATION。
-
SIO_ROUTING_INTERFACE_CHANGE (操作码设置:I、T==1)
-
若要接收路由接口更改的通知,该更改应用于访问输入缓冲区中的远程地址, (指定为 sockaddr 结构) 。 完成此 IOCTL 后,不会提供有关新路由接口的输出信息;完成仅指示给定目标的路由接口已更改,应使用 SIO_ROUTING_INTERFACE_QUERY IOCTL 进行查询。
假定 (,尽管) 应用程序使用重叠的 I/O 来通过完成SIO_ROUTING_INTERFACE_CHANGE请求来通知路由接口更改, 但 这不是必需的。 或者,如果 SIO_ROUTING_INTERFACE_CHANGE IOCTL 是在非阻塞套接字上发出的,并且 lpOverlapped 和 lpCompletionRoutine 参数设置为 NULL) , 它将立即完成并显示错误 WSAEWOULDBLOCK ,Windows 套接字 SPI 客户端随后可以通过调用 LPWSPEventSelect 或 LPWSPAsyncSelect 来等待路由更改事件,并在网络事件位掩码中设置FD_ROUTING_INTERFACE_CHANGE位。
人们认识到,路由信息在大多数情况下保持稳定,因此要求应用程序保留多个未完成的 IOCTL 以获取有关其感兴趣的所有目标的通知,以及让服务提供商跟踪这些通知请求将使用大量的系统资源。 可通过扩展输入参数的含义并放宽服务提供商要求来避免这种情况,如下所示:
Windows 套接字 SPI 客户端可以指定协议系列特定的通配符地址, (与 请求 绑定到任何可用地址时绑定调用中使用的通配符地址相同,) 请求任何路由更改的通知。 这允许 Windows 套接字 SPI 客户端为其拥有的所有套接字和目标保留一个未完成 的SIO_ROUTING_INTERFACE_CHANGE ,然后使用 SIO_ROUTING_INTERFACE_QUERY 获取实际的路由信息。
服务提供商可以选择忽略 Windows 套接字 SPI 客户端在 SIO_ROUTING_INTERFACE_CHANGE (输入缓冲区中提供的信息,就像 Windows 套接字 SPI 客户端) 指定通配符地址一样,在发生任何路由信息更改时完成 SIO_ROUTING_INTERFACE_CHANGE IOCTL 或信号FD_ROUTING_INTERFACE_CHANGE事件 (而不仅仅是到输入缓冲区中指定的目标的路由) 。
-
SIO_ROUTING_INTERFACE_QUERY (操作码设置:I、O、T==1)
-
若要获取本地接口的地址, (表示为 sockaddr 结构) ,该结构应用于发送到输入缓冲区中指定的远程地址 (sockaddr) 。 可以在输入缓冲区中提交远程多播地址,以获取多播传输的首选接口的地址。 在任何情况下,应用程序都可以在后续 绑定 请求中使用返回的接口地址。
请注意,路由可能会更改。 因此,Windows 套接字 SPI 客户端不能依赖于 SIO_ROUTING_INTERFACE_QUERY 返回的信息是永久性的。 SPI 客户端可以使用 SIO_ROUTING_INTERFACE_CHANGE IOCTL 注册路由更改通知,该 IOCTL 通过重叠 I/O 或FD_ROUTING_INTERFACE_CHANGE事件提供通知。 以下操作序列可用于保证 Windows 套接字 SPI 客户端始终具有给定目标的当前路由接口信息:
- IOCTL SIO_ROUTING_INTERFACE_CHANGE问题。
- IOCTL SIO_ROUTING_INTERFACE_QUERY问题。
- 每当 SIO_ROUTING_INTERFACE_CHANGE IOCTL 通过重叠 I/O 或通过FD_ROUTING_INTERFACE_CHANGE事件 () 发出信号来通知 WinSock SPI 客户端路由更改时,应重复整个操作序列。
如果输出缓冲区的大小不足以包含接口地址,SOCKET_ERROR将作为此 IOCTL 的结果返回, WSAGetLastError 将返回 WSAEFAULT。 在本例中,输出缓冲区的所需大小将以 l 返回。 请注意,如果 lpvInBuffer、 lpvOutBuffer 或 lBytesReturned 参数未完全包含在用户地址空间的有效部分中,也会返回 WSAEFAULT 错误代码。
如果无法通过任何可用接口访问输入缓冲区中指定的目标地址,则此 IOCTL 的结果返回SOCKET_ERROR,如果所有网络连接丢失, WSAGetLastError 将返回 WSAENETUNREACH 甚至 WSAENETDOWN 。
-
SIO_SET_COMPATIBILITY_MODE (操作码设置:I、T==3)
-
请求网络堆栈应如何处理某些行为,这些行为的默认处理方式可能因 Windows 版本而异。 SIO_SET_COMPATIBILITY_MODE 的参数结构是在 Mswsockdef.h 头文件中定义的 WSA_COMPATIBILITY_MODE 结构中指定的。 此结构定义如下:
} 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_QOS (操作码设置:I,T==1)
-
将提供的 QOS 结构与套接字相关联。 不需要输出缓冲区,将从输入缓冲区获取 QOS 结构。 WSAENOPROTOOPT 错误代码指示为不支持服务质量的服务提供商。
-
SIO_TRANSLATE_HANDLE (操作码设置:I、O、T==1)
-
若要获取在配套接口的上下文中 有效的相应句 柄, (例如,TH_NETDEV 和 TH_TAPI) 。 在输入缓冲区中指定标识配套接口的清单常量以及任何其他所需参数。 完成此函数后,输出缓冲区中将提供相应的句柄。 有关其他详细信息,请参阅 Windows 套接字 2 Protocol-Specific 附件 和/或文档中的相应部分了解特定配套界面。 对于不支持指定配套接口的此 IOCTL 的服务提供商,指示 WSAENOPROTOOPT 错误代码。 此 IOCTL 使用 SIO_TRANSLATE_HANDLE 检索关联的句柄。
建议使用 COM 而不是此 IOCTL 来发现和跟踪套接字可能支持的其他接口。 此 IOCTL 用于与 COM 不可用或因其他原因无法使用的系统向后兼容。
-
SIO_UDP_CONNRESET (操作码设置:I、T==3)
-
Windowsxp: 控制是否报告 UDP PORT_UNREACHABLE消息。 设置为 TRUE 以启用报告。 设置为 FALSE 可禁用报告。
使用重叠套接字调用时, lpOverlapped 参数必须在重叠操作期间有效。
如果 lpCompletionRoutine 参数为 NULL,则当重叠操作完成时,如果 lpCompletionRoutine 参数包含有效的事件对象句柄,则服务提供程序会向 lpOverlapped 的 hEvent 成员发出信号。 Windows 套接字 SPI 客户端可以使用 LPWSPGetOverlappedResult 轮询或等待事件对象。
如果 lpCompletionRoutine 不为 NULL,则 忽略 hEvent 成员,Windows 套接字 SPI 客户端可以使用该成员将上下文信息传递给完成例程。 为相同的重叠 I/O 请求传递非 NULLlpCompletionRoutine 并稍后调用 WSAGetOverlappedResult 的客户端可能不会将 WSAGetOverlappedResult 调用的 fWait 参数设置为 TRUE。 在这种情况下, hEvent 成员的使用未定义,尝试等待 hEvent 成员会产生不可预知的结果。
当重叠操作完成时,服务提供商负责安排客户端指定的完成例程的调用。 由于必须在启动重叠操作的同一线程的上下文中执行完成例程,因此无法直接从服务提供程序调用它。 WS2_32.DLL 提供异步过程调用 (APC) 机制,以方便调用完成例程。
服务提供商通过调用 WPUQueueApc 安排在适当的线程和进程上下文中执行的函数。 可以从任何进程和线程上下文调用此函数,甚至是不同于用于启动重叠操作的线程和进程的上下文。
WPUQueueApc 将指向 WSATHREADID 结构的指针作为输入参数, (通过 lpThreadId 输入参数) 提供给提供程序、指向要调用的 APC 函数的指针,以及随后传递给 APC 函数的 32 位上下文值。 由于只有单个 32 位上下文值可用,因此 APC 函数本身不能是客户端指定的完成例程。 服务提供商必须改为提供指向其自己的 APC 函数的指针,该函数使用提供的上下文值访问重叠操作所需的结果信息,然后调用客户端指定的完成例程。
客户端提供的完成例程的原型如下所示:
);
CompletionRoutine 是客户端提供的函数的占位符。 dwError 指定重叠操作的完成状态,如 lpOverlapped 所指示。 cbTransferred 指定返回的字节数。 目前,没有定义标志值, dwFlags 将为零。 此函数不返回值。
从此函数返回允许为此套接字调用另一个挂起的完成例程。 可以按任何顺序调用完成例程,但不一定按照重叠操作完成的顺序调用。
兼容性
T == 0 的 IOCTL 代码是伯克利套接字中使用的 IOCTL 代码的子集。 具体而言,没有等效于 FIOASYNC 的命令。
注意
当给定线程退出时,将取消由给定线程启动的所有 I/O。 对于重叠套接字,如果在操作完成之前关闭线程,挂起的异步操作可能会失败。 有关详细信息 ,请参阅 ExitThread 。
要求
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
标头 | ws2spi.h |