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

yipeiwu_com6年前Python基础

一、原因浅析

今天在写一个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中没有二维数组,用一个元素为list的list(matrix)保存矩阵,row为行数,col为列数 1. 上下翻转:只需要把每一行的list交换即可 for i in r...

python中模块的__all__属性详解

python模块中的__all__属性,可用于模块导入时限制,如: from module import * 此时被导入模块若定义了__all__属性,则只有__all__内指定的属...

pygame游戏之旅 如何制作游戏障碍

pygame游戏之旅 如何制作游戏障碍

本文为大家分享了pygame游戏之旅的第6篇,供大家参考,具体内容如下 定义一个障碍模型函数: def things(thingx, thingy, thingw, thingh,...

ML神器:sklearn的快速使用及入门

ML神器:sklearn的快速使用及入门

传统的机器学习任务从开始到建模的一般流程是:获取数据 -> 数据预处理 -> 训练建模 -> 模型评估 -> 预测,分类。本文我们将依据传统机器学习的流程,看看在...

利用Anaconda完美解决Python 2与python 3的共存问题

前言 现在Python3 被越来越多的开发者所接受,同时让人尴尬的是很多遗留的老系统依旧运行在 Python2 的环境中,因此有时你不得不同时在两个版本中进行开发,调试。 如何在系统中同...