最近利用Boost::asio实现了一个服务器,测试过程中发现大量客户端连接服务器,然后客户端异常断开之后,已经连接的客户端能正常工作,但是却不能建立新的客户端连接了。
原因分析:
使用netstat -nlpt 查看分析
发现服务器监听端口正常
netstat -ap查看已经建立的连接数量
发现该服务器存在大量的close_waiting和last_ack的状态的半连接,甚至已经达到了进程限制的最大连接数(默认使用的1024个),
发现应该是由于半连接占用大量的连接资源,从而引起资源不足导致的连接失败。
解决办法:
在调用socket.close()方法之前,先调用acceptor.shutdown()方法主动关闭这个半连接。
保证服务器一定会释放连接。