当前位置: 移动技术网 > IT编程>脚本编程>Python > Python socket.error: [Errno 98] Address already in use的原因和解决方法

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

2019年03月27日  | 移动技术网IT编程  | 我要评论

张佑赫,小学六年级数学下册教学计划,买人参

一、原因浅析

今天在写一个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)) 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网