Python socket.error: [Errno 98] Address already in use的原因和解决方法,socket.errorerrno
Python socket.error: [Errno 98] Address already in use的原因和解决方法,socket.errorerrno
一、原因浅析
今天在写一个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))
端口被占用了
sudo lsof -i:8087 查看哪个进程占用,kill之
一般可能开了多个proxy.py或者上次开的没有退出,killall python既可
或者加上-p #####这个参数,指定一个空的端口
socket.error: [Errno 48] Address already in use
这个就是错误的原因,通信的端口已经被占用了。你之前应该是开过一次goagent了吧,并且没有关掉。看文件路径应该是Mac下吧,你可以打开终端,敲ps回车看一下:
是不是也有中间那个有Python的那一行。
不出意外的话应该是有的,说明你的goagent已经开了,你可以kill掉这个进程,然后就可以重开了。
相关内容
- Python中的startswith和endswith函数使用实例,startswithendsw
- Python写的创建文件夹自定义函数mkdir(),
- python的类变量和成员变量用法实例教程,python实例教程
- Python实现根据指定端口探测服务器/模块部署的方法,
- python实现从字符串中找出字符1的位置以及个数的方法,
- python3编写C/S网络程序实例教程,python3实例教程
- python常用web框架简单性能测试结果分享(包含django、fl
- Python3.0与2.X版本的区别实例分析,python3.02.x
- Python实现多行注释的另类方法,python多行
- Python升级提示Tkinter模块找不到的解决方法,pythontkint
评论关闭