作者在 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到完成端口后形成了线程关联?完成端口绝对没问题,因为我重复使用都没出问题。
这。。。。。。。。哎,烦,一天一个结果。