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 相关文章推荐
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
Python THREADING模块中的JOIN()方法深入理解
Feb 18 Python
Django中使用locals()函数的技巧
Jul 16 Python
在Python中的Django框架中进行字符串翻译
Jul 27 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
Python变量和字符串详解
Apr 29 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
Python I/O与进程的详细讲解
Mar 08 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
新建文件时Pycharm中自动设置头部模板信息的方法
Apr 17 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
Jul 09 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
一个简单实现多条件查询的例子
2006/10/09 PHP
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
javascript面向对象之对象的深入理解
2015/01/13 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
Python迭代和迭代器详解
2016/11/10 Python
python实现词法分析器
2019/01/31 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
计算机应用专业推荐信
2013/11/13 职场文书
优秀员工年终发言演讲稿
2014/01/01 职场文书
市场营销专业求职信
2014/06/17 职场文书
新闻传播专业求职信
2014/07/22 职场文书
学生检讨书如何写
2014/10/30 职场文书
2014年房产销售工作总结
2014/12/08 职场文书
顶岗实习协议书
2015/01/29 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
银行资信证明
2015/06/17 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
索尼ICF-36收音机评测
2022/04/30 无线电