gpt4 book ai didi

Python套接字编程: "Address already in use" after exception

转载 作者:行者123 更新时间:2023-11-28 22:37:15 24 4
gpt4 key购买 nike

我有一个小型服务器在我的 Raspberry Pi 上运行,它监听特定端口。但是,每当连接过程中出现异常,连接终止时,似乎对端口的分配并不是“未绑定(bind)”。

这是一个示例代码:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', 5005))
s.listen(1)
with s.accept()[0] as c:
raise Exception() # Act as if anything goes wrong

当我第一次运行它并在另一个终端上执行 telnet localhost 5005 时,连接建立并且服务器按预期引发异常。但是,当我尝试第二次运行它时,出现了这个错误:

Traceback (most recent call last):
File "testsocketexception.py", line 4, in <module>
s.bind(('', 5005))
OSError: [Errno 98] Address already in use

即使在服务器上引发异常,我如何确保套接字未绑定(bind)?(顺便说一句,这似乎不会发生在 Windows 中。)

最佳答案

在绑定(bind)套接字之前设置SO_REUSEADDR 套接字选项。

the SO_REUSEADDR flag tells the kernel to reuse a local socket in TIME_WAIT state, without waiting for its natural timeout to expire.

from socket documentation


with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 5005))
...

注意:如果上次运行时保留了 TIME_WAIT 套接字(没有 SO_REUSEADDR 选项),即使您应用此方法也会出现错误。

关于Python套接字编程: "Address already in use" after exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36690667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com