测试一个简单的TCP套接字程序,client向server请求建立连接然后释放。
在一台主机上同时运行两个client时,出现报错“Cannot assign requestedaddress”
将server的请求处理改为3线程的线程池后问题解决。
但同时运行的client数量继续增加时,如15个client同时运行,该问题再次出现。
在网上找到问题分析如下:
客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”。是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。
可见问题不在于server端,而是client端频繁建立连接,而端口释放较慢,导致建立新连接时无可用端口。
网上的解决方法:
执行命令修改如下2个内核参数(需要root权限)
sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
在一台主机上同时运行两个client时,出现报错“Cannot assign requestedaddress”
将server的请求处理改为3线程的线程池后问题解决。
但同时运行的client数量继续增加时,如15个client同时运行,该问题再次出现。
在网上找到问题分析如下:
客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”。是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。
可见问题不在于server端,而是client端频繁建立连接,而端口释放较慢,导致建立新连接时无可用端口。
网上的解决方法:
执行命令修改如下2个内核参数(需要root权限)
sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAITsockets的快速回收。