MSDN 说 AcceptEx() 可能返回 TRUE,但我永远无法重现这一点。
如果 AcceptEx() 返回 TRUE,是否会设置 hEvent?在 AcceptEx() 返回 TRUE 后调用 GetOverlappedResult() 是否安全?
ReadFile() 等其他函数也一样吗?
MSDN 说 AcceptEx() 可能返回 TRUE,但我永远无法重现这一点。
如果 AcceptEx() 返回 TRUE,是否会设置 hEvent?在 AcceptEx() 返回 TRUE 后调用 GetOverlappedResult() 是否安全?
ReadFile() 等其他函数也一样吗?
至少对于 ReadFile(socket) 来说是这样的:
如果 ReadFile() 成功或失败并出现 ERROR_IO_PENDING,则设置事件。
如果在调用 ReadFile() 之前连接已关闭,则连接失败,并且未设置事件。
从我从 MSDN 页面AcceptEx
和OVERLAPPED
结构中可以看出,AcceptEx
完成后应该将OVERLAPPED::hEvent
句柄设置为已发出信号。
操作完成时系统将设置为信号状态的事件句柄。在将此结构传递给任何重叠的函数之前,用户必须使用 CreateEvent 函数将此成员初始化为零或有效的事件句柄。
它在这里的讨论相当广泛,我可以肯定地说它适用于所有采用OVERLAPPED
结构的函数。
如果您AcceptEx
从不返回 true,则可能是您的代码中存在错误。除非您发布实际代码,否则很难说出那可能是什么。
在同一页上OVERLAPPED
它说这个ReadFile
ReadFile 和 WriteFile 等函数在开始 I/O 操作之前将此句柄设置为非信号状态。当操作完成时,句柄设置为信号状态。
关于调用GetOverlappedResult
它还具体说明了要做什么:
诸如
GetOverlappedResult
同步等待函数之类的函数将自动重置事件重置为非信号状态。因此,您应该使用手动重置事件;如果您使用自动重置事件,如果您等待操作完成然后调用 GetOverlappedResult 并将 bWait 参数设置为 TRUE,您的应用程序可能会停止响应。
就像@HansPassant 在评论中所说,不要使用它。