更改/更新 CompletionKey

Posted

技术标签:

【中文标题】更改/更新 CompletionKey【英文标题】:Change/Update the CompletionKey 【发布时间】:2020-06-02 16:24:03 【问题描述】:

ULONG_PTR CKey = 2; CreateIoCompletionPort(...Ckey...);

在我调用函数后,是否可以以某种方式? 此外,serversock 和 clientsock 上发生的操作(例如,AcceptEx 在接受和接收的模式下)仅返回服务器的完成,我可以将其更改为 Client 还是更好地更改两者?

【问题讨论】:

没有充分的理由更改 IOCP 的完成键。无论出于何种原因,您认为您需要这样做,请重新考虑您的方法。至于AcceptEx(),如果你在接受连接后指示它接收数据,直到接收到数据后才会通知它的完成。这在documentation 中有明确说明:“如果提供了接收缓冲区,在接受连接并读取数据之前,重叠操作不会完成.". 您执行的任何 I/O 操作也是如此 - 直到整个操作完成后才会通知其完成。至于客户,我不明白你在问什么。您是否在询问如何在客户端向服务器发送数据时获得完成通知?您可以通过 ConnectEx()WSASend() 在客户端使用 IOCP。 【参考方案1】:

是否可以在我之后以某种方式更改/更新 CompletionKey 调用函数?

这可能从 Windows 8.1

开始

你需要使用NtSetInformationFileFileReplaceCompletionInformation

更改或删除指定文件句柄的 I/O 完成端口。调用者提供一个指向 FILE_COMPLETION_INFORMATION 指定端口的结构 句柄和完成键。如果端口句柄为非 NULL,则此 句柄指定与文件关联的新 I/O 完成端口 处理。删除与文件关联的 I/O 完成端口 句柄,将结构中的端口句柄设置为NULL。获得一个端口 句柄,用户模式调用者可以调用 CreateIoCompletionPort 功能。

请注意,对于指定文件句柄的初始设置 I/O 完成端口,我们使用FileCompletionInformation

但是,即使这是可能的,我认为在大多数情况下都是错误的,不需要这样做

【讨论】:

是否可以在常规 Windows 应用程序中使用NtSetInformationFile?这是为司机保留的吗?

以上是关于更改/更新 CompletionKey的主要内容,如果未能解决你的问题,请参考以下文章

Boost::Asio 的 IOCP CompletionKey?

Laravel 5.3更新记录。仅更新已更改的记录并保留未更改的记录

主干:更改事件后更新模型

属性更改时 Observable 不更新列表

访问 - 预览更新查询将更改的内容

更改文化时wpf更新验证错误