iocp完成端口的问题(高级)
对于BOOL bIORet = GetQueuedCompletionStatus(......)
返回 FALSE,GetLastError()=64,查到“指定的网络名不再可用。”
这时的LPOVERLAPPED* lpOverlapped为NULL,导致无法删除该内存。
怎么办?
问题点数:100、回复次数:9Top
1 楼lianglp(寻找黄金分割点)回复于 2005-11-18 17:32:31 得分 0
因为你的socket句柄无效了,也就是说指定的socket句柄被closesocket()了。Top
2 楼RayL(水)回复于 2005-11-18 17:48:09 得分 0
原因我知道,是我自己搞的测试client搞出来的。关键是解决办法,谢谢!Top
3 楼RayL(水)回复于 2005-11-18 17:51:46 得分 0
其实可以在key那里做文章,但是这样总感觉不妥。。。Top
4 楼RayL(水)回复于 2005-11-21 10:34:31 得分 0
高手呢?Top
5 楼dingpiao(.......)回复于 2005-11-21 10:57:07 得分 0
就当没收呗Top
6 楼dingpiao(.......)回复于 2005-11-21 10:57:38 得分 0
sprintf(LogMsg,"GetQueuedCompletionStatus failed with error %d\n", GetLastError());
ShowLogMsg(1,LogMsg);
if(iError==64)
{
// continue;
}Top
7 楼RayL(水)回复于 2005-11-21 17:26:19 得分 0
不行的,那段内存不删除怎么可以呢?Top
8 楼DoItFreely(Freely)回复于 2005-11-21 17:44:47 得分 0
如果是C++,让那块内存跟那个Socket/IO对象关联,由IO对象负责释放Top
9 楼lifengice0706(无)回复于 2005-11-21 18:52:39 得分 100
wsadata中只要你指定一个地址而已,你可以对每一个socket维护一段buffer,当返回64时,你必须closesocket()的,这时free()不就ok了,何况key是个很好的办法。
http://community.csdn.net/Expert/TopicView3.asp?id=4370844看看有帮助没?Top




