一个关于基于IOCP架构的通信程序,运行一段时间后无法,客户端再也连接不上问题,请各位大神帮忙分析一下,万分感谢

时间:2021-05-05 14:13:36
我做了一个数据采集软件,通信服务网络架构采用的是小猪发布在网上的一个关于IOCP的例子(  http://piggyxp.download.csdn.net/ 基本上没有改动)。目前情况是有300多个客户端连接服务程序,刚开始连接的时候基本上300多个都能连接上,能正常的收发数据。但是运行五六个小时后出现了问题,那些离线的客户端再也无法连接上程序了。已经连上没有掉线的客户端能正常收发数据,但是一掉线就再
也连不上了。我用模拟软件ComPortDebug尝试连接也连接不上,显示拒绝连接(错误代码是10060)。但是通信程序重启之后客户端又能正常连接了。我研究了一下初步猜想可能是 投递AcceptEX请求出了问题,导致没有socket用于等待连接。但是又不确定是不是这个原因,希望各位大神能帮我分析一下。ps: 这个程序是有心跳机制的,大概几分钟没有收到客户端的心跳包,就会判定离线,释放资源。

5 个解决方案

#1


连不上的时候,看一下服务端是不是有很多socket处于close_wait状态

#2


用netstat -ano查看了一下,只有几个处于close_wait的状态。大多数都是established状态。

#3


引用 2 楼 jjyy2015 的回复:
用netstat -ano查看了一下,只有几个处于close_wait的状态。大多数都是established状态。


还有可能是listen的socket已经不在监听了,

#4


嗯,我觉得也是,但是不知道什么情况能造成listen的socket不监听了。我使用的是完成端口,在程序启动的时候将程序用于监听的socket与完成端口绑定,使用AcceptEx函数投递accept请求。

#5


你采用了心跳机制。。。重连是在几分钟之内还是过掉了几分钟还是连不上?    如果是几分钟之内,客户端关闭连接close_wait状态。。。但服务端忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。

#1


连不上的时候,看一下服务端是不是有很多socket处于close_wait状态

#2


用netstat -ano查看了一下,只有几个处于close_wait的状态。大多数都是established状态。

#3


引用 2 楼 jjyy2015 的回复:
用netstat -ano查看了一下,只有几个处于close_wait的状态。大多数都是established状态。


还有可能是listen的socket已经不在监听了,

#4


嗯,我觉得也是,但是不知道什么情况能造成listen的socket不监听了。我使用的是完成端口,在程序启动的时候将程序用于监听的socket与完成端口绑定,使用AcceptEx函数投递accept请求。

#5


你采用了心跳机制。。。重连是在几分钟之内还是过掉了几分钟还是连不上?    如果是几分钟之内,客户端关闭连接close_wait状态。。。但服务端忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。