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

本文详细记录了一次网络通信调试过程中遇到的WSA 10004错误,并深入分析了错误产生的原因及解决办法。通过实例说明了在关闭socket后未正确设置为INVALID_SOCKET可能导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在进行网络通信调试的时候遇到一个错误: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联系调用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值