也连不上了。我用模拟软件ComPortDebug尝试连接也连接不上,显示拒绝连接(错误代码是10060)。但是通信程序重启之后客户端又能正常连接了。我研究了一下初步猜想可能是 投递AcceptEX请求出了问题,导致没有socket用于等待连接。但是又不确定是不是这个原因,希望各位大神能帮我分析一下。ps: 这个程序是有心跳机制的,大概几分钟没有收到客户端的心跳包,就会判定离线,释放资源。
5 个解决方案
#1
连不上的时候,看一下服务端是不是有很多socket处于close_wait状态
#2
用netstat -ano查看了一下,只有几个处于close_wait的状态。大多数都是established状态。
#3
还有可能是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
还有可能是listen的socket已经不在监听了,
#4
嗯,我觉得也是,但是不知道什么情况能造成listen的socket不监听了。我使用的是完成端口,在程序启动的时候将程序用于监听的socket与完成端口绑定,使用AcceptEx函数投递accept请求。
#5
你采用了心跳机制。。。重连是在几分钟之内还是过掉了几分钟还是连不上? 如果是几分钟之内,客户端关闭连接close_wait状态。。。但服务端忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。