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数组的处理代码
Jan 04 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
python写一个md5解密器示例
Feb 23 Python
python如何通过twisted实现数据库异步插入
Mar 20 Python
python得到qq句柄,并显示在前台的方法
Oct 14 Python
Python补齐字符串长度的实例
Nov 15 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
python中的decimal类型转换实例详解
Jun 26 Python
通过实例了解python property属性
Nov 01 Python
python3访问字典里的值实例方法
Nov 18 Python
最新Python idle下载、安装与使用教程图文详解
Nov 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
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
php函数连续调用实例分析
2015/07/30 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
显示、隐藏密码
2006/07/01 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
JavaScript事件 "事件对象"的注意要点
2016/01/14 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
js表单验证实例讲解
2016/03/31 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
JS中type="button"和type="submit"的区别
2017/07/04 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
在Python下尝试多线程编程
2015/04/28 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
python3中str(字符串)的使用教程
2017/03/23 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
Python从列表推导到zip()函数的5种技巧总结
2019/10/23 Python
python 命名规范知识点汇总
2020/02/14 Python
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
党员个人整改措施
2014/10/24 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
意向协议书
2015/01/27 职场文书
httpclient调用远程接口的方法
2022/08/14 Java/Android