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调用。
错误的发生情况如下:
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调用。
相关文章推荐
- 用SimpleDateFormat格式化日期和时间
- RocketMQ集群配置
- C语言解决约瑟夫问题算法
- 面试题24:二叉搜索树的后序遍历序列
- Tomcat 项目中的图标(ICON)设置
- 调用有道词典查词
- jQuery实现当拉动滚动条到底部加载数据
- java学习08--程序流程控制--判断结构
- android添加背景音乐
- linux 图片处理 imagemagic
- 选择排序
- CSS HACK技术
- 冒泡排序
- archive的时候报“ no identity found"错误 解决方案
- Android环境搭建Win7
- Java 并发:Executors 和线程池
- 机器学习之梯度下降法
- warning C4996: ‘sprintf': This function or variable may be unsafe. Consider using sprintf_s instead.
- mysql 查询时间条件问题
- Android Studio使用OpenCV后,使APP不安装OpenCV Manager即可运行