995 : 由于线程退出或应用程序请求,已放弃 I/O 操作。

作者在 2011-01-30 22:42:03 发布以下内容
在一个线程A中检测AcceptEx的存量,如果小于某个数值则投递一定数量的AcceptEx到完成端口。这个线程非常简单,但是在程序退出时必须清理掉投递到完成端口中的那些AcceptEx,以达到释放资源。因此,在程序退出前我必须发出信号给线程A,告诉它要终止运行。然,线程A是终止运行了,但存在完成端口中的AcceptEx还没清理,我尝试了一下几种清理方式:
第一天、直接closesocket(listensocket)关闭这个关联到完成端口的监听SOCKET。
    这种方式,失败了!完成端口鸟都没鸟这已经关闭的listensocket,没有发生出队一个失败的完成包。
第二天、先调用shutdown(listensocket)。
    这次成了,完成端口疯狂的发出失败的完成包。我很后悔,没有记录到完成端口失败的代码。
第三天、什么都不调用。
    这是今天发生的,我重新运行了昨天的程序。突然发现在shutdown(listensocket)之前完成端口就已经开始发出怒吼。这次我捕捉到了错误代码995!咋回事啊 !?在昨天,我也观察过,通过shutdown后才发生失败完成包,为什么今天就这么积极了啊?!
 
做过一些实验后,我心中有点想法。这是不是线程A投递AcceptEx到完成端口后形成了线程关联?完成端口绝对没问题,因为我重复使用都没出问题。
 
这。。。。。。。。哎,烦,一天一个结果。
winsock+icop | 阅读 14696 次
文章评论,共5条
迷失的木桶(作者)
2011-01-30 22:46
1
现在,我更愿意相信这是跟线程关联的!
迷失的木桶(作者)
2011-01-30 23:32
2
<a href="http://hi.baidu.com/justin_wu2010/blog/item/67ade1f014da8ec67831aab1.html" target="_blank">http://hi.baidu.com/justin_wu2010/blog/item/67ade1f014da8ec67831aab1.html</a><br />
总算找到靠谱的解答 了!<br />
<br />
在windows的错误宏定义如下:<br />
// MessageId: ERROR_OPERATION_ABORTED<br />
//<br />
// MessageText:<br />
//<br />
// The I/O operation has been aborted because of either a thread exit or an application request.<br />
//<br />
#define ERROR_OPERATION_ABORTED&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 995L<br />
大意是:由于线程退出或应用程序请求,已放弃 I/O 操作<br />
<br />
其实原因是:<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;由给定线程启动的所有 I/O 在该线程退出时均被取消。如果线程在操作完成前退出,挂起的异步操作则会失败
迷失的木桶(作者)
2011-01-31 20:09
3
今天又进行了实验,得出了一些结论。<br />
1、shutdown(listensock, SD_BOTH) 不会使AcceptEx从完成端口失败返回。<br />
2、closesocket(listensock) 能使AcceptEx从完成端口失败返回,错误代码995。<br />
3、投递AcceptEx到完成端口的线程被退出(不是单单关闭线程句柄),AcceptEx从完成端口失败返回,错误代码995。<br />
<br />
。。。。。
迷失的木桶(作者)
2011-01-31 20:50
4
从MSDN中发现了一小段文字。。。。<br />
<br />
Note&nbsp; &nbsp;All I/O initiated by a given thread is canceled when that thread exits. For overlapped sockets, pending asynchronous operations can fail if the thread is closed before the operations complete. See ExitThread for more information.
根团初脑(游客)
2018-08-08 16:59
5
游客请输入验证码
最新评论