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中的fabs()方法的使用
May 14 Python
简单介绍Python2.x版本中的cmp()方法的使用
May 20 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
Python AES加密模块用法分析
May 22 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
Feb 18 Python
python库lxml在linux和WIN系统下的安装
Jun 24 Python
Python Subprocess模块原理及实例
Aug 26 Python
python文件读取失败怎么处理
Jun 23 Python
Python利用pip安装tar.gz格式的离线资源包
Sep 14 Python
python 如何上传包到pypi
Dec 24 Python
Pytorch 图像变换函数集合小结
Feb 01 Python
python opencv通过4坐标剪裁图片
Jun 05 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中文字母数字验证码实现代码
2008/04/25 PHP
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
2015/12/18 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
微信小程序 向左滑动删除功能的实现
2017/03/10 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
Vue实现点击箭头上下移动效果
2020/06/11 Javascript
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
Saltstack快速入门简单汇总
2016/03/01 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
解决python 输出是省略号的问题
2018/04/19 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
Ibatis如何使用动态表名
2015/07/12 面试题
护理专业毕业生自荐信范文
2014/01/05 职场文书
春季运动会广播稿大全
2014/02/19 职场文书
体操比赛口号
2014/06/10 职场文书
北京青年观后感
2015/06/15 职场文书
学历证明样本
2015/06/16 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js