LPWSPCANCELBLOCKINGCALL 回调函数 (ws2spi.h)

LPWSPCancelBlockingCall 函数取消当前正在进行的阻塞调用。

语法

LPWSPCANCELBLOCKINGCALL Lpwspcancelblockingcall;

int Lpwspcancelblockingcall(
  [out] LPINT lpErrno
)
{...}

参数

[out] lpErrno

指向错误代码的指针。

返回值

如果操作已成功取消,则 LPWSPCancelBlockingCall 返回的值为零。 否则,将返回值 SOCKET_ERROR,并且 lpErrno 中提供了特定的错误代码。

错误代码 含义
WSAENETDOWN
网络子系统失败。
WSAEINVAL
指示没有未完成的阻止调用。

注解

此函数将取消此线程的任何未完成的阻塞操作。 它通常用于两种情况:

  • Windows 套接字 SPI 客户端正在处理在服务提供商实现伪阻止时收到的消息。 在这种情况下, WSAIsBlocking 为 true。
  • 阻止调用正在进行中,Winsock 服务提供程序已通过从 WPUQueryBlockingCallback) 检索到的回调函数 (调用了 Winsock SPI 客户端的阻塞挂钩函数,后者又调用此函数。 例如,在为需要较长时间才能完成的操作实现 Cancel 选项时,可能会出现这种情况。

在每种情况下,原始阻止调用将尽快终止并显示错误 WSAEINTR。 (首先,除非 Windows 消息计划导致控制还原回到 Winsock 中的伪阻止例程,否则不会终止。第二个实例中,阻塞挂钩函数完成s.)

在阻止 LPWSPConnect 操作的情况下,Winsock 将尽快终止阻止调用,但在连接完成 (然后重置) 或超时之前,无法释放套接字资源。仅当 Winsock SPI 客户端立即尝试打开新的套接字 () 没有可用的套接字,或者通过 LPWSPConnect 调用连接到同一对等方时,这种情况才可能很明显。

取消 LPWSPAcceptLPWSPSelect 调用不会对传递给这些调用的套接字产生负面影响。 只有特定调用失败;取消之前合法的任何操作在取消后都是合法的,并且套接字的状态不会以任何方式受到影响。

取消 除 LPWSPAcceptLPWSPSelect 以外的任何操作可能会使套接字处于不确定状态。 如果 Winsock SPI 客户端取消对套接字的阻止操作,则 Winsock SPI 客户端能够对该套接字执行的唯一操作是调用 LPWSPCloseSocket,尽管其他操作可以在某些 Winsock 服务提供程序上运行。 如果 Winsock SPI 客户端需要最大的可移植性,则必须注意不要依赖于在取消操作后执行的操作。 Winsock SPI 客户端可以通过将SO_LINGER上的超时设置为零并调用 LPWSPCloseSocket 来重置连接。

如果取消操作以任何方式损害了SOCK_STREAM数据流的完整性,Winsock 提供程序将重置连接,并使除 WSAECONNABORTEDLPWSPCloseSocket 以外的所有未来操作失败。

如果阻止网络操作在取消之前完成, 则 LPWSPCancelBlockingCall 可以成功返回。 在这种情况下,阻止操作将成功返回,就像从未调用 过 LPWSPCancelBlockingCall 一样。 Winsock SPI 客户端确认操作实际已取消的唯一方法是检查阻止调用中的 WSAEINTR 返回代码。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
标头 ws2spi.h

另请参阅

WPUQueryBlockingCallback

WSAIsBlocking

LPWSPAccept

LPWSPCloseSocket

LPWSPSelect

LPWSPSocket