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 相关文章推荐
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
介绍Python的Django框架中的QuerySets
Apr 20 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
Python3 replace()函数使用方法
Mar 19 Python
Python中is和==的区别详解
Nov 15 Python
Python中整数的缓存机制讲解
Feb 16 Python
pytorch 自定义数据集加载方法
Aug 18 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
在Python中字典按值排序的实现方法
Nov 12 Python
python中tkinter复选框使用操作
Nov 11 Python
再谈python_tkinter弹出对话框创建
Mar 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
mysql5写入和读出乱码解决
2006/11/25 PHP
PHP中改变图片的尺寸大小的代码
2011/07/17 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
Python Socket使用实例
2017/12/18 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
详解Python高阶函数
2020/08/15 Python
详解Anaconda 的安装教程
2020/09/23 Python
Python自动化测试基础必备知识点总结
2021/02/07 Python
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
企业军训感言
2014/02/08 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
食品安全宣传标语
2014/06/07 职场文书
研究生求职自荐书
2014/06/23 职场文书
新党章心得体会
2014/09/04 职场文书
2016党员党课心得体会
2016/01/07 职场文书
四则混合运算教学反思
2016/02/23 职场文书
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python