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复制与引用用法分析
Apr 08 Python
各个系统下的Python解释器相关安装方法
Oct 12 Python
Python3中的真除和Floor除法用法分析
Mar 16 Python
Python面向对象特殊成员
Apr 24 Python
python爬虫之百度API调用方法
Jun 11 Python
Python基础学习之常见的内建函数整理
Sep 06 Python
python网络爬虫学习笔记(1)
Apr 09 Python
使用python3构建文件传输的方法
Feb 13 Python
python在回调函数中获取返回值的方法
Feb 22 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 Python
Python随机数函数代码实例解析
Feb 09 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 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数据库密码的找回的步骤
2011/01/12 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
js判断上传文件后缀名是否合法
2016/01/28 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
React应用中使用Bootstrap的方法
2017/08/15 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
python解析html开发库pyquery使用方法
2014/02/07 Python
python使用range函数计算一组数和的方法
2015/05/07 Python
python获得一个月有多少天的方法
2015/06/04 Python
python爬虫的工作原理
2017/03/05 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
2018/12/18 Python
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
什么是Web Service?
2012/07/25 面试题
1亿有多大教学反思
2014/05/01 职场文书
升职自荐书
2019/05/09 职场文书
python 如何用terminal输入参数
2021/05/25 Python
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python