Python socket.error: [Errno 98] Address already in use的原因和解决方法

作者:junjie 时间:2021-07-12 01:27:02 

一、原因浅析

今天在写一个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,socket.error:,[Errno,98],Address,already,in,use
0
投稿

猜你喜欢

  • Python3写入文件常用方法实例分析

    2023-08-24 14:44:53
  • Python检测和防御DOS攻击的最简单方法

    2022-04-12 17:23:19
  • SQL Server中选出指定范围行的SQL语句代码

    2024-01-28 08:39:14
  • 手把手教你在Python里使用ChatGPT

    2023-11-10 02:55:58
  • python颜色随机生成器的实例代码

    2022-12-03 19:40:05
  • Python面向对象编程基础实例分析

    2023-03-31 16:39:58
  • Python列表删除元素del、pop()和remove()的区别小结

    2021-12-02 07:32:41
  • Pycharm修改python路径过程图解

    2022-10-27 15:57:26
  • 详解SQL Server分布式查询

    2010-09-19 09:07:00
  • jsp中文显示问号问题解决方法

    2023-07-22 10:33:50
  • python将邻接矩阵输出成图的实现

    2022-11-12 01:58:39
  • python自动安装pip

    2021-04-06 09:30:00
  • Python面向对象类的继承实例详解

    2023-04-19 11:06:38
  • Python cookbook(数据结构与算法)实现查找两个字典相同点的方法

    2022-07-20 22:09:46
  • Python爬取微信小程序通用方法代码实例详解

    2021-04-08 15:30:09
  • MySQL8 批量修改字符集脚本

    2024-01-16 12:50:34
  • 一文读懂navicat for mysql基础知识

    2024-01-23 00:46:25
  • Python Web框架之Django框架cookie和session用法分析

    2021-08-23 05:30:15
  • 如何解决springboot数据库查询时出现的时区差异问题

    2024-01-26 01:53:01
  • Python使用Dijkstra算法实现求解图中最短路径距离问题详解

    2022-07-31 02:40:33
  • asp之家 网络编程 m.aspxhome.com