使用IOCP时OVERLAPPED结构的目的是什么?

时间:2015-02-24 16:14:15

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

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

2 个答案:

答案 0 :(得分:2)

来自documentation for WSARecv

  

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

     

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

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

答案 1 :(得分:0)

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

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