MSDN说,AcceptEx()可能返回TRUE,但我从未能够再现它。
如果AcceptEx()返回TRUE,将设置hEvent吗?在GetOverlappedResult()返回TRUE后调用AcceptEx()安全吗?
其他函数(如ReadFile() )也是这样吗?
发布于 2013-09-17 15:34:25
至少对于ReadFile(套接字)是这样的:
如果ReadFile()在ERROR_IO_PENDING中成功或失败,则设置事件。
如果在调用ReadFile()之前关闭了连接,它就会失败,并且事件不会被设置。
发布于 2013-08-21 12:32:15
从AcceptEx上的MSDN页面和OVERLAPPED结构中可以看出,当AcceptEx完成时,应该将OVERLAPPED::hEvent句柄设置为信号。
来自重叠MSDN页面
当操作完成时系统将设置为信号状态的事件句柄。用户在将此结构传递给任何重叠函数之前,必须将该成员初始化为零或使用CreateEvent函数初始化有效的事件句柄。
它在这里讲得相当广泛,我认为它适用于所有采用OVERLAPPED结构的函数,这是安全的。
如果您的AcceptEx从未返回true,则可能是您的代码中有错误。除非你发布了实际的代码,否则很难知道那可能是什么。
在OVERLAPPED的同一页中,它提到了ReadFile
ReadFile和WriteFile等函数在开始I/O操作之前将此句柄设置为无信号状态。在操作完成后,句柄设置为信号状态.。
关于调用GetOverlappedResult,它还具体说明了该做什么:
函数,如
GetOverlappedResult和同步等待函数,将自动重置事件重置为无信号状态。因此,您应该使用手动重置事件;如果使用自动重置事件,则如果您等待操作完成,应用程序可以停止响应,然后调用参数设置为TRUE.的GetOverlappedResult。
正如HansPassant在评论中所说的,不要使用它。
https://stackoverflow.com/questions/18357337
复制相似问题