【问题标题】:Python Binding Socket: “Address already in use”, after closing socketPython 绑定套接字:“地址已在使用中”,关闭套接字后
【发布时间】:2019-11-01 13:32:59
【问题描述】:

我知道已经有一个类似的问题,但没有一个解决方案能解决我的问题。通过 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

所以很明显这个过程调用了 c.close() 和 s.close()。那这个地址怎么还能用呢?

【问题讨论】:

    标签: python sockets tcp client


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。这就是问题所在。我想停止阅读并调用 s.close() 是错误的方法。我知道在主机上调用 s.shutdown() 并继续阅读,直到连接关闭。这样我可以立即重复使用该地址。
    猜你喜欢
    • 2021-05-21
    • 2011-09-16
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多