如何解决socket通信server端的address already in use的错误

最近用Python 的socketserver框架进行TCP/IP socket服务器端的项目。但是服务器主程序正常退出以后,再启动该服务器主程序就会遇到Address already in use这个错误

这个错误其实是由bind()函数抛出的。但是这个错误绝对不是由于服务器程序退出的时候忘记close socket造成的。 http://www.ibm.com/developerworks/cn/linux/l-sockpit/

IBM的这篇文章中解释了这个错误发生的原因:

bind 普遍遭遇的问题是试图绑定一个已经在使用的端口。该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(bind 返回EADDRINUSE),它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟。在 TIME_WAIT 状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。 等待 TIME_WAIT 结束可能是令人恼火的一件事,特别是如果您正在开发一个套接字服务器,就需要停止服务器来做一些改动,然后重启。幸运的是,有方法可以避开 TIME_WAIT 状态。可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用

原来要设置reuse address选项。于是查询python socketserver文档,发现确实server实例有allow_reuse_address这个属性.这个属性默认为False. 只要将该属性设置为True就可以解决问题啦!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值