关于Python tcpt通讯中端口复用的解决 [Errno 98] Address already in use

错误代码如下:

tcpClient_socket.bind(locall_addr)
OSError: [Errno 98] Address already in use

出现这种错误的原因是:

这是因为在TCP/IP终止连接的四次握手中,当最后的ACK回复发出后,有个2MSL的时间等待,MSL指一个片段在网络中最大的存活时间,这个时间一般是30秒,所以基本上过60秒后就可以重新连接!

为什么要等待2MSL?是因为在最后发出ACK回复后,发送方不能确认ACK是否被另一端正常收到,如果另一端没有收到ACK回复的话,将会在1MSL后再次发送FIN片段。所以说发送方等待2MSL时间,也就是刚好它发ACK回复和对方发送FIN片段的时间,如果此时间内都没有再次收到FIN片段的话,发送方就假设对方已经正常接收到了ACK回复,此时它就会正常关闭连接!


解决办法:

如果要复用需要显示设定,即在绑定前调用setsockop函数t让套接字允许地址重用:socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)


代码如下:

tcpClient_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#tcpClient_socket.settimeout(CHECK_TIMEOUT)
tcpClient_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
locall_addr = ("", 7890)
# 绑定本地信息
tcpClient_socket.bind(locall_addr)
以上即可以解决!

猜你喜欢

转载自blog.csdn.net/weixin_40612082/article/details/80024996