这里有最完美的解决socket.error: [Errno 98] Address already in use问题

一、基本设置

如果python中socket 绑定的地址正在使用,往往会出现错误,

在linux下:

            则会显示“ socket.error: [Errno 98] Address already in use”

在windows下:

          则会显示 “socket.error: [Errno 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次”


这是因为socket默认不支持地址复用,如果要复用需要显示设定,即在绑定前调用setsockop函数t让套接字允许地址重用:socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

例如:

[python] view plain copy
  1. self.recSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    
  2. self.recSocket.settimeout(CHECK_TIMEOUT)  
  3. self.recSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)    
  4. self.recSocket.bind(('', UDP_PORT))    

二、进一步设置( 并发连接量大需要设置

上述是在程序中设置重用,此外如果并发连接请求过多的时候,即短时间内连接请求很多,系统自动释放已占用端口的时间还没有到,又有连接请求(可用的端口已经被用完),所以还会出现 Address already in use错误提示),就会产生大量的TIME_WAIT状态的连接。这种情况下就有必要调整下Linux的TCP/IP内核参数,让系统更快的释放TIME_WAIT连接。

用vi打开配置文件:

[python] view plain copy
  1. # vi  /etc/sysctl.conf  

然后,在这个文件中,加入下面的几行内容(详细内容及解释参见 文章    修改Linux内核参数,减少TCP连接中的TIME-WAITlinux TCP连接配置):

[python] view plain copy
  1. net.ipv4.tcp_syncookies = 1    # 这一行配置文件里如果有就不用添加了  
  2. net.ipv4.tcp_tw_reuse = 1  
  3. net.ipv4.tcp_tw_recycle = 1  
  4. net.ipv4.tcp_fin_timeout = 5  

最后输入下面的命令,让内核参数生效:

[python] view plain copy
  1. # /sbin/sysctl -p  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值