GetQueuedCompletionStatus 和超时

GetQueuedCompletionStatus and time out

请问GetQueuedCompletionStatus中的dwMilliseconds参数到底负责什么?

是的,我了解所有内容都写在 MSDN 上:https://docs.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatus

dwMilliseconds

The number of milliseconds that the caller is willing to wait for a completion packet to appear at the completion port. If a completion packet does not appear within the specified time, the function times out, returns FALSE, and sets *lpOverlapped to NULL.

If dwMilliseconds is INFINITE, the function will never time out...

但我无法理解 - “等待完成数据包出现”。

假设我调用了 WSARecv 函数,它在完成端口上放置了一个读取任务,并且我有条件地设置了 dwMilliseconds == 1000 (ms)。在这种情况下它是什么意思 - “等待完成数据包出现”??

-这是从调用WSARecv到FINISHED任务出现在完成端口的时间,可以使用函数GetQueuedCompletionStatus获取?

-或者是从调用 WSARecv 函数到读取任务将被放置到完成端口的时刻之间的时间?

我完全糊涂了。

Suppose I called the WSARecv function, which puts a read task on the completion port...

这就是你犯错的地方。 WSARecv 任务本身(或任何 I/O 任务,就此而言)根本不放在 IOCP 上。它被提交给将处理任务的任何驱动程序。套接字(或其他 I/O 对象)与 IOCP 关联,因此当读取任务完成时,驱动程序将 result 将该任务放入 IOCP 的队列中,然后您可以使用 GetQueuedCompletionStatus() 进行检索。这就是为什么它被称为 完成数据包 - 它是一个描述任务 完成 的数据包。您正在等待 任务结果出现在 IOCP 队列中。

and I conditionally set dwMilliseconds == 1000 (ms). What does it mean in this case - "to wait for a completion packet to appear" ??

-This is the time from the moment of calling BCAreq to the moment when the FINISHED task appears in the completion port, which can be obtained using the function GetQueuedCompletionStatus ?

-Or is it the time between the call to the WSARecvfunction and the moment when the read task will be placed on the completion port?

都没有。它是从您输入 GetQueuedCompletionStatus()任何与 IOCP 关联的 I/O 任务 的任何结果可供您使用的时间从 IOCP 的队列中检索。因此,在这种情况下,您最多等待 1 秒,等待任何排队的 I/O 结果可供您使用。