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 多线程应用介绍
Dec 19 Python
零基础写python爬虫之打包生成exe文件
Nov 06 Python
Python对列表排序的方法实例分析
May 16 Python
python3实现UDP协议的服务器和客户端
Jun 14 Python
Python3.7中安装openCV库的方法
Jul 11 Python
python操作kafka实践的示例代码
Jun 19 Python
Python求离散序列导数的示例
Jul 10 Python
使用Python的turtle模块画国旗
Sep 24 Python
Python IDLE或shell中切换路径的操作
Mar 09 Python
python实现马丁策略的实例详解
Jan 15 Python
分析Python list操作为什么会错误
Nov 17 Python
python保存图片的四个常用方法
Feb 28 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
多重?l件?合查?(二)
2006/10/09 PHP
php查看session内容的函数
2008/08/27 PHP
PHP中Date()时间日期函数的使用方法小结
2011/04/20 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
js文字横向滚动特效
2015/11/11 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
2017/01/06 Javascript
bootstrap手风琴制作方法详解
2017/01/11 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
2019/04/10 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
python GUI实现小球满屏乱跑效果
2019/05/09 Python
python实现PID算法及测试的例子
2019/08/08 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
优秀民警事迹材料
2014/01/29 职场文书
青春演讲稿范文
2014/05/08 职场文书
西湖英语导游词
2015/02/06 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
python 实现定时任务的四种方式
2021/04/01 Python
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js
vue实现简单数据双向绑定
2021/04/28 Vue.js
详解JAVA的控制语句
2021/11/11 Java/Android
Nginx报404错误的详细解决方法
2022/07/23 Servers