0

MSDN 说 AcceptEx() 可能返回 TRUE,但我永远无法重现这一点。

如果 AcceptEx() 返回 TRUE,是否会设置 hEvent?在 AcceptEx() 返回 TRUE 后调用 GetOverlappedResult() 是否安全?

ReadFile() 等其他函数也一样吗?

4

2 回答 2

1

至少对于 ReadFile(socket) 来说是这样的:
如果 ReadFile() 成功或失败并出现 ERROR_IO_PENDING,则设置事件。
如果在调用 ReadFile() 之前连接已关闭,则连接失败,并且未设置事件。

于 2013-09-17T15:34:25.607 回答
0

从我从 MSDN 页面AcceptExOVERLAPPED结构中可以看出,AcceptEx完成后应该将OVERLAPPED::hEvent句柄设置为已发出信号。

来自OVERLAPPED 的 MSDN 页面

操作完成时系统将设置为信号状态的事件句柄。在将此结构传递给任何重叠的函数之前,用户必须使用 CreateEvent 函数将此成员初始化为零或有效的事件句柄。

它在这里的讨论相当广泛,我可以肯定地说它适用于所有采用OVERLAPPED结构的函数。

如果您AcceptEx从不返回 true,则可能是您的代码中存在错误。除非您发布实际代码,否则很难说出那可能是什么。

在同一页上OVERLAPPED它说这个ReadFile

ReadFile 和 WriteFile 等函数在开始 I/O 操作之前将此句柄设置为非信号状态。当操作完成时,句柄设置为信号状态。

关于调用GetOverlappedResult它还具体说明了要做什么:

诸如GetOverlappedResult同步等待函数之类的函数将自动重置事件重置为非信号状态。因此,您应该使用手动重置事件;如果您使用自动重置事件,如果您等待操作完成然后调用 GetOverlappedResult 并将 bWait 参数设置为 TRUE,您的应用程序可能会停止响应。

就像@HansPassant 在评论中所说,不要使用它。

于 2013-08-21T12:32:15.867 回答