【问题标题】:GetQueuedCompletionStatus and time outGetQueuedCompletionStatus 和超时
【发布时间】:2021-10-16 12:25:49
【问题描述】:

请告诉我 GetQueuedCompletionStatus 中的 dwMilliseconds 参数具体负责什么?

是的,我知道一切都写在 MSDN 上:https://docs.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatus

dw毫秒

调用者愿意等待的毫秒数 完成数据包出现在完成端口。如果完成 数据包未在指定时间内出现,函数次数 out,返回 FALSE,并将 *lpOverlapped 设置为 NULL。

如果 dwMilliseconds 为 INFINITE,则函数永远不会超时...

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

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

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

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

我完全糊涂了。

【问题讨论】:

  • 这一次你等待从端口弹出的数据包。如果一段时间内没有数据包(或 iocp 上的活动线程限制) - GetQueuedCompletionStatus 返回超时错误。并且 WSARecv 不是 将读取任务放在完成端口上 - 它会将读取任务 (IRP) 放到驱动程序中。任务完成时 - 驱动程序完成 IRP 并将其放入 iocp。
  • 时间从调用GetQueuedCompletionStatus开始
  • 什么是 BCAREq?
  • iocp 不知道 WSARecv 并且结果调用(和超时)不依赖于这个和其他 I/O 操作。等待期从GetQueuedCompletionStatus 调用开始,如果dwMilliseconds 没有从端口弹出数据包 - 等待停止并返回
  • GetQueuedCompletionStatus 等待某物获得的时间。 WSARecv 在完成时发布一个完成。 (不是什么时候开始的。)

标签: c winapi winsock


【解决方案1】:

假设我调用了 WSARecv 函数,它在完成端口上放置了一个读取任务......

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

我有条件地设置 dwMilliseconds == 1000 (ms)。在这种情况下是什么意思 - “等待完成数据包出现”??

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2021-10-16
    • 2011-07-25
    相关资源
    最近更新 更多