python socket报10048和99错误


我用python写了一个tcp的短连接压力测试脚本,开启100个线程并发的不停的创建socket,连接socket,发送数据,接收数据,关闭socket这样一个过程,但是脚本运行一小会儿,socket就开始报错(windows机器上报errno=10048,linux服务器上报errno=99),谁能告诉我这是怎么回事,如解决。强调:socket每次都有调用close

python socket

上帝的左手 11 years, 6 months ago

问题原因:
普通情况下tcp socket在调用close后立即返回,socket进入TIME_WAIT状态,并等待2*MSL的时间(大概是1~4分钟)才进入Closed状态,因此当大规模并发的短连接发生时会很快消耗掉所有的本地可用的端口,从而造成上诉问题。
解决办法:
通过setsockopt方法设置socket的SO_LINGER选项来改变socket的close方法的行为。设置linger.l_onoff=1,linger.l_linger=0,设置该选项值之后调用close,socket立即关闭连接,丢弃掉所有send buffer中的数据,并向对端发送RST,而不是进入通常的4次握手关闭连接。
python中代码如下

   
  optval = struct.pack("ii",1,0)
  
tcp_client.setsockopt(SOL_SOCKET, SO_LINGER, optval )

青青爱艾艾 answered 11 years, 6 months ago

Your Answer