Python socket.error: [Errno 98] Address already in use的原因和解决方法


Posted in Python onAugust 25, 2014

一、原因浅析

今天在写一个Python与html5 Websocket 实例,么次终止运行重新运行脚本总是提示地址已经存在并且被使用!查询相关文档才知道在socket编程中,当通过客户端向服务器端发送消息,关闭了连接后,这时如果马上再去运行服务器端程序,会提示这个错误:

socket.error: [Errno 98] Address already in use

这是因为在TCP/IP终止连接的四次握手中,当最后的ACK回复发出后,有个2MSL的时间等待,MSL指一个片段在网络中最大的存活时间,这个时间一般是30秒,所以基本上过60秒后就可以重新连接!
为什么要等待2MSL?是因为在最后发出ACK回复后,发送方不能确认ACK是否被另一端正常收到,如果另一端没有收到ACK回复的话,将会在1MSL后再次发送FIN片段。所以说发送方等待2MSL时间,也就是刚好它发ACK回复和对方发送FIN片段的时间,如果此时间内都没有再次收到FIN片段的话,发送方就假设对方已经正常接收到了ACK回复,此时它就会正常关闭连接!

二、解决方法

如果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)

例如:

        self.recSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  

        self.recSocket.settimeout(CHECK_TIMEOUT)

        self.recSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  

        self.recSocket.bind(('', UDP_PORT)) 
Python 相关文章推荐
Python运行的17个时新手常见错误小结
Aug 07 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
Apache如何部署django项目
May 21 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
创建Django项目图文实例详解
Jun 06 Python
python实现函数极小值
Jul 10 Python
如何使用repr调试python程序
Feb 28 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 Python
python中validators库的使用方法详解
Sep 23 Python
Python对小数进行除法运算的正确方法示例
Aug 25 #Python
Python实现的一个自动售饮料程序代码分享
Aug 25 #Python
Python中请使用isinstance()判断变量类型
Aug 25 #Python
Python中变量交换的例子
Aug 25 #Python
Python实现的一个找零钱的小程序代码分享
Aug 25 #Python
Python跳出循环语句continue与break的区别
Aug 25 #Python
Python中声明只包含一个元素的元组数据方法
Aug 25 #Python
You might like
php定界符
2014/06/19 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
探寻Javascript执行效率问题
2014/11/12 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
jQuery扩展+xml实现表单验证功能的方法
2016/12/25 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
js+canvas实现画板功能
2020/09/13 Javascript
python解析html开发库pyquery使用方法
2014/02/07 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
python爬虫神器Pyppeteer入门及使用
2019/07/13 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
python能在浏览器能运行吗
2020/06/17 Python
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
创业计划书六个要素
2013/12/26 职场文书
运动会邀请函范文
2014/02/06 职场文书
团日活动总结书格式
2014/05/08 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
运动会表扬稿
2015/01/16 职场文书
终止劳动合同通知书
2015/04/16 职场文书
运动会加油稿
2015/07/22 职场文书
创业计划书详解
2019/07/19 职场文书
vue+elementui 实现新增和修改共用一个弹框的完整代码
2021/06/08 Vue.js
详解Python描述符的工作原理
2021/06/11 Python
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript