ProcessSocketNotifications 函数 (winsock2.h)

将一组套接字与完成端口相关联,并检索该端口上已挂起的任何通知。 关联后,完成端口将收到指定的套接字状态通知。 仅支持 Microsoft Winsock 提供程序套接字。

若要减少系统调用开销,可以注册通知,并在对 ProcessSocketNotifications 的单个调用中检索它们。 或者,可以通过调用常用的 I/O 完成端口函数(如 GetQueuedCompletionStatus)显式检索它们。 使用 ProcessSocketNotifications 检索的通知与使用 GetQueuedCompletionStatusEx 检索的通知相同,其中可能包括套接字状态更改以外的通知数据包。

通知事件标志是返回的OVERLAPPED_ENTRY结构的 dwNumberOfBytesTransferred 字段的整数值。 这类似于使用 JOBOBJECT_ASSOCIATE_COMPLETION_PORT,后者还使用 dwNumberOfBytesTransferred 字段发送整数消息。 调用 SocketNotificationRetrieveEvents 函数以获取它们。

套接字句柄一次只能注册到一个 IOCP。 重新注册以前注册的套接字句柄会覆盖现有注册。 在关闭用于注册的句柄之前,应显式删除注册,并等待 SOCK_NOTIFY_EVENT_REMOVE 通知 (请参阅本主题中的 备注) 。

有关详细信息和代码示例,请参阅 Winsock 套接字状态通知

语法

DWORD WSAAPI ProcessSocketNotifications(
  HANDLE                   completionPort,
  UINT32                   registrationCount,
  SOCK_NOTIFY_REGISTRATION *registrationInfos,
  UINT32                   timeoutMs,
  ULONG                    completionCount,
  OVERLAPPED_ENTRY         *completionPortEntries,
  UINT32                   *receivedEntryCount
);

参数

completionPort

类型:_In_ HANDLE

使用 CreateIoCompletionPort 函数创建的 I/O 完成端口的句柄。 当代表套接字发送消息时,将在 PostQueuedCompletionStatus 函数的 CompletionPort 参数中使用端口。

registrationCount

类型:_In_ UINT32

registrationInfos 提供的注册数。

registrationInfos

类型:_Inout_updates_opt_ (registrationCount) SOCK_NOTIFY_REGISTRATION*

指向定义通知注册参数 的SOCK_NOTIFY_REGISTRATION 结构的数组的指针。 其中包括感兴趣的套接字、感兴趣的通知事件和操作标志。 成功后,必须检查元素是否成功处理了注册。 如果 registrationCount 为 0,则此参数必须为 NULL

timeoutMs

类型:_In_ UINT32

你愿意等待完成数据包出现在完成端口的时间(以毫秒为单位)。 如果完成数据包未在指定时间内显示,则该函数将超时并返回 ERROR_TIMEOUT

如果 timeoutMsINFINITE (0xFFFFFFFF) ,则该函数永远不会超时。如果 timeoutMs 为 0,并且没有要取消排队的 I/O 操作,则该函数将立即超时。

如果 completionCount 为 0,则 timeoutMs 的值必须为 0。

completionCount

类型:_In_ ULONG

要移除的最大 OVERLAPPED_ENTRY 结构数。 如果指定了 0,则只会处理注册操作。

completionPortEntries

类型:_Out_writes_to_opt_ (completionCount、*receivedEntryCount) OVERLAPPED_ENTRY*

在输入时,指向预先分配的 OVERLAPPED_ENTRY 结构数组。 数组不得与 registrationInfos 数组重叠。 如果 completionCount 为 0,则 completionPortEntries 的值必须为 NULL

在输出时,接收包含条目的 OVERLAPPED_ENTRY 结构的数组。 数组元素的数目由 ReceivedEntryCount 提供。 结构的 dwNumberOfBytesTransferred 字段是已接收事件的整数掩码。 lpOverlapped 字段是保留字段,不得用作指针。

receivedEntryCount

类型:_Out_opt_ UINT32*

指向接收已删除条目数的变量的指针。 如果 completionCount 为 0,则必须为 NULL

返回值

如果成功,则返回 ERROR_SUCCESS。 如果函数成功,并且你提供了非 0 completionCount,但在指定时间内未显示完成数据包,则 返回 WAIT_TIMEOUT。 否则, 将返回相应的 WSAE* 错误代码。

如果返回 ERROR_SUCCESSWAIT_TIMEOUT ,则必须检查个人注册信息的注册结果。 否则,整个操作将失败,并且未发生任何更改。

注解

有关收到通知时可能出现的事件,请参阅 SocketNotificationRetrieveEvents

要求

   
最低受支持的客户端 Windows 10内部版本 20348
最低受支持的服务器 Windows 10内部版本 20348
标头 winsock2.h
Library Ws2_32.lib
DLL Ws2_32.dll

另请参阅