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编写检测数据库SA用户的方法
Jul 11 Python
python实现自动更换ip的方法
May 05 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
pandas数据集的端到端处理
Feb 18 Python
python爬虫 urllib模块url编码处理详解
Aug 20 Python
Python字典中的值为列表或字典的构造实例
Dec 16 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
Nov 12 Python
Python图像读写方法对比
Nov 16 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
python基础入门之普通操作与函数(三)
Jun 13 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截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
php实现Mysql简易操作类
2015/10/11 PHP
PHP上传图片类显示缩略图功能
2016/06/30 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
python3 flask实现文件上传功能
2020/03/20 Python
python pygame实现2048游戏
2018/11/20 Python
python 内置模块详解
2019/01/01 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
简单的命令查看安装的python版本号
2020/08/28 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
社区敬老月活动实施方案
2014/02/17 职场文书
小学生感恩演讲稿
2014/04/25 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
MongoDB使用profile分析慢查询的步骤
2021/04/30 MongoDB
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android