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 相关文章推荐
Linux下Python获取IP地址的代码
Nov 30 Python
Python科学画图代码分享
Nov 29 Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
如何实现Django Rest framework版本控制
Jul 25 Python
python word转pdf代码实例
Aug 16 Python
Django stark组件使用及原理详解
Aug 22 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
Apr 22 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
Jun 15 Python
Python 制作查询商品历史价格的小工具
Oct 20 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 高级课程笔记 面向对象
2009/06/21 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
JavaScript 语言的递归编程
2010/05/18 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
理解Koa2中的async&await的用法
2018/02/05 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
python实现文件名批量替换和内容替换
2014/03/20 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
python读取图片任意范围区域
2019/01/23 Python
python实现弹跳小球
2019/05/13 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
上海方立数码笔试题
2013/10/18 面试题
金融专业应届生求职信
2013/11/02 职场文书
开办饭店创业计划书
2013/12/28 职场文书
新学期教师寄语
2014/04/02 职场文书
体育比赛口号
2014/06/09 职场文书
小学生作文评语集锦
2014/12/25 职场文书
检讨书大全
2015/01/27 职场文书
三峡人家导游词
2015/01/31 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android