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 yield机制的异步操作同步化编程模型
Mar 18 Python
利用python程序生成word和PDF文档的方法
Feb 14 Python
python如何获取服务器硬件信息
May 11 Python
python 获取list特定元素下标的实例讲解
Apr 09 Python
python 保存float类型的小数的位数方法
Oct 17 Python
Django 视图层(view)的使用
Nov 09 Python
python url 参数修改方法
Dec 26 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
python+selenium+chromedriver实现爬虫示例代码
Apr 10 Python
Python logging模块handlers用法详解
Aug 14 Python
10个python爬虫入门实例(小结)
Nov 01 Python
python本地文件服务器实例教程
May 02 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
论建造顺序的重要性
2020/03/04 星际争霸
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
2010/03/20 Javascript
jQuery的context属性用法实例
2014/12/27 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
python类中super()和__init__()的区别
2016/10/18 Python
python递归查询菜单并转换成json实例
2017/03/27 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
2019/08/24 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
de Bijenkorf比利时官网:荷兰最知名的百货商店
2017/06/29 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
介绍一下MD5加密算法
2016/11/12 面试题
招商业务员岗位职责
2013/12/16 职场文书
大学生职业生涯规划范文
2014/01/22 职场文书
单位员工收入证明样本
2014/10/09 职场文书
党建工作整改措施
2014/10/28 职场文书
教师个人教学总结
2015/02/11 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
Fluentd搭建日志收集服务
2022/09/23 Servers