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编程实现双击更新所有已安装python模块的方法
Jun 05 Python
利用django如何解析用户上传的excel文件
Jul 24 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
pip安装py_zipkin时提示的SSL问题对应
Dec 29 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
Jul 05 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
如何让PyQt5中QWebEngineView与JavaScript交互
Oct 21 Python
如何用python插入独创性声明
Mar 31 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自动更新新闻DIY
2006/10/09 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
Javascript 实现TreeView CheckBox全选效果
2010/01/11 Javascript
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
Python splitlines使用技巧
2008/09/06 Python
Python入门学习之字符串与比较运算符
2015/10/12 Python
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
html5录音功能实战示例
2019/03/25 HTML / CSS
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
职业技术学校毕业生推荐信
2013/12/03 职场文书
思想品德课教学反思
2014/02/10 职场文书
建筑安全生产目标责任书
2014/07/23 职场文书
规范化管理年活动总结
2014/08/29 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python