Python绑定套接字:“;地址已在使用中”;,合上插座后

Python绑定套接字:“;地址已在使用中”;,合上插座后,python,sockets,tcp,client,Python,Sockets,Tcp,Client,我知道已经有一个类似的问题了,但没有一个解决方案能解决我的问题。通过ssh,我在远程客户端上启动了一个脚本 nohup python script.py & 此脚本包含以下内容: TCP_PORT = 5005 host = "" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.settimeout(40) s.

我知道已经有一个类似的问题了,但没有一个解决方案能解决我的问题。通过ssh,我在远程客户端上启动了一个脚本

nohup python script.py &
此脚本包含以下内容:

TCP_PORT = 5005
host = ""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.settimeout(40)
s.bind((host, TCP_PORT))
s.listen(0)
c, addr = s.accept()

...some code...

try:
    while True:
        c.send(str(1).ljust(16).encode())
except Exception as e:
    print("exiting main")
    print(e)
    c.close()
    s.close()
当我在e行中运行代码两次时,第二次总是出现上述错误。python输出的日志:

exiting main
[Errno 32] Broken pipe

Traceback (most recent call last):
  File "LogImages.py", line 204, in <module>
    main(interv)
  File "LogImages.py", line 114, in main
    s.bind((host, TCP_PORT))
OSError: [Errno 98] Address already in use
正在退出主服务器
[Errno 32]管道破裂
回溯(最近一次呼叫最后一次):
文件“LogImages.py”,第204行,在
主(内部)
文件“LogImages.py”,第114行,主
s、 绑定((主机、TCP_端口))
OSError:[Errno 98]地址已在使用中

显然,这个过程调用c.close()和s.close()。那么地址怎么还能继续使用呢?

关闭套接字只会释放任何底层连接的句柄。实现仍然需要一段时间才能完成连接的有序关闭,在此期间,地址仍在使用中


例如,如果您有一个活动连接,而另一方没有从中读取数据,则实现将给它时间读取发送的数据。在此期间,该地址仍在使用。

谢谢您的回答。这就是问题所在。我想停止阅读并调用s.close()是错误的方法。我知道在主机上调用s.shutdown(),并继续读取,直到连接关闭。这样我就可以立即重用该地址。