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简单程序读取串口信息的方法
Mar 13 Python
python通过文件头判断文件类型
Oct 30 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
python基础教程项目二之画幅好画
Apr 02 Python
Django集成CAS单点登录的方法示例
Jun 10 Python
Python一键安装全部依赖包的方法
Aug 12 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
部署Django到阿里云服务器教程示例
Jun 03 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
Python3爬虫里关于代理的设置总结
Jul 30 Python
Python高阶函数与装饰器函数的深入讲解
Nov 10 Python
python编程简单几行代码实现视频转换Gif示例
Oct 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提取视频网站页面中的FLASH地址的代码
2010/04/17 PHP
深入解析php中的foreach问题
2013/06/30 PHP
php出现web系统多域名登录失败的解决方法
2014/09/30 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
PHP输出多个元素的排列或组合的方法
2017/03/14 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
从零开始学习jQuery (六) jquery中的AJAX使用
2011/02/23 Javascript
理解javascript中的回调函数(callback)
2014/09/02 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
JavaScript中实现map功能代码分享
2015/06/11 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
微信小程序 拍照或从相册选取图片上传代码实例
2019/08/28 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
python爬虫获取多页天涯帖子
2018/02/23 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
win10安装python3.6的常见问题
2020/07/01 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
《再别康桥》教学反思
2014/02/12 职场文书
简爱读书笔记
2015/06/26 职场文书
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技