更改/更新 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
开始你需要使用NtSetInformationFile
和FileReplaceCompletionInformation
更改或删除指定文件句柄的 I/O 完成端口。调用者提供一个指向
FILE_COMPLETION_INFORMATION
指定端口的结构 句柄和完成键。如果端口句柄为非 NULL,则此 句柄指定与文件关联的新 I/O 完成端口 处理。删除与文件关联的 I/O 完成端口 句柄,将结构中的端口句柄设置为NULL。获得一个端口 句柄,用户模式调用者可以调用 CreateIoCompletionPort 功能。
请注意,对于指定文件句柄的初始设置 I/O 完成端口,我们使用FileCompletionInformation
但是,即使这是可能的,我认为在大多数情况下都是错误的,不需要这样做
【讨论】:
是否可以在常规 Windows 应用程序中使用NtSetInformationFile
?这是为司机保留的吗?以上是关于更改/更新 CompletionKey的主要内容,如果未能解决你的问题,请参考以下文章
Boost::Asio 的 IOCP CompletionKey?