【问题标题】:What is the purpose of the OVERLAPPED structure when using IOCP?使用 IOCP 时,OVERLAPPED 结构的目的是什么?
【发布时间】:2015-02-24 16:14:14
【问题描述】:

我不完全明白OVERLAPPED 结构的目的是什么,它是用于高级的东西吗?例如,如果我想接收数据,我只需创建WSABUF 结构的实例并将其传递给WSARecv(),当读取操作完成时,我会处理缓冲区。但是OVERLAPPED 结构在哪里适合所有这些呢?

【问题讨论】:

  • 执行异步IO时需要
  • @David Heffernan IOCP 不是异步 IO 吗?
  • WSARecv 可以与重叠和非重叠套接字一起使用
  • @David Heffernan 是的,我知道。我的意思是使用 IOCP(重叠套接字)时它的用途。
  • OVERLAPPED 被驱动程序用来确定将操作结果写入何处。 WSABUF 可以追溯到更简单的时代,这不足以让驱动程序满意,因为它无法存储缓冲区偏移量。

标签: c++ sockets winapi network-programming iocp


【解决方案1】:

来自documentation for WSARecv

如果 lpCompletionRoutine 参数为 NULL,则 hEvent 参数 lpOverlapped 在重叠操作完成时发出信号,如果它 包含有效的事件对象句柄。一个应用程序可以使用 WSAWaitForMultipleEvents 或 WSAGetOverlappedResult 等待或轮询 事件对象。

如果 lpCompletionRoutine 不为 NULL,则忽略 hEvent 参数 并且可以被应用程序用来将上下文信息传递给 完成例程。传递非 NULL 的调用者 lpCompletionRoutine 和后来调用 WSAGetOverlappedResult 的 相同的重叠 I/O 请求可能不会为其设置 fWait 参数 将 WSAGetOverlappedResult 调用为 TRUE。在这种情况下使用 hEvent 参数的未定义,并试图等待 hEvent 参数会产生不可预知的结果。

因此,要么您没有使用完成例程,而是可以等待事件发出完成信号。或者您正在使用完成例程,并且可以使用事件字段为完成例程提供上下文。

【讨论】:

  • 所以在我的情况下(我没有使用完成例程),我可以等待OVERLAPPED 实例中的事件字段来查看IO操作何时完成?
【解决方案2】:

如上所述,OVERLAPPED 结构为您的 I/O 操作提供上下文。无论是使用完成例程,还是通过GetQueuedCompletionStatus 轮询/等待。

请记住,通常在 IOCP 中,您可以在单个句柄上挂起多个操作。在某些情况下,这也是获取状态/错误信息的唯一方法(例如,请参阅 GetQueuedCompletionStatusEx)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2016-03-19
    相关资源
    最近更新 更多