您的位置:首页 > 其它

WSAGetLastError:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断 的解决

2015-07-03 15:32 393 查看
今天在进行网络通信调试的时候遇到一个错误:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断。

错误的发生情况如下:

Server:

1. 一个线程启动一个socket1 在监听,接收到到来的client连接.

2. 同时,启动一个socket2作为client,连接到另外一个MessageServer上,今天因为MessageServer没有启动,所以这个socket2连接失败,调用了closesocket( socket2),但是socket2没有被置成INVALID_SOCKET。

3. 来了一个client连接到socket1 上,接收到一个包,然后调用了socket2打算发送一个消息到MessageServer上,而且,发送函数里面没有判断socket2是否已经连接上,就直接调用了send,这个调用当然是失败,失败后调用了closesocket(socket2),这个调用后监听线程里面的accept函数开始出错了,错误就是“10004 一个封锁操作被对 WSACancelBlockingCall的调用中断”。

最后的解决和发现:

socket1 是在socket2后被创建的。

socket2创建后,数值是5580,第一次被closesocket(socket2)后,socket1 开始创建,这个5580被socket1 获得,socket1 的值是5580。

后面socket1 接收到一个连接后,到了上面的第三步骤的时候,发送数据失败后,再次调用了closesocket(socket2),这个时候实际上是调用了closesocket(5580),所以导致了accept操作开始失败,出现错误10004.

后记:

切记切记:调用了closesocket后,一定要把里面的socket即时赋值成INVALID_SOCKET,更重要的是,不要对了一个socket进行多次的closesocket调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: