退出/崩溃时关闭服务器套接字

7
我正在学习如何在Python中使用套接字,但经常遇到程序崩溃或我使用Ctrl+C停止程序后,服务器套接字仍然保持在端口上监听。这显然会阻止程序再次启动时监听该端口,所以我必须不断更改它。
我猜想我需要在某个地方执行socket.close(),但是在哪里呢?
2个回答

11
你可以尝试使用atexit模块。
import atexit

function close_socket:
    s.close()

atexit.register(close_socket)
如果问题是测试期间端口变得不可用的延迟,我建议设置 SO_REUSEADDR,这将允许端口立即重新绑定,而不是等待 TCP 栈上的超时。
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

1
终止程序会自动关闭所有套接字。但是,TCP端口在此之后仍然保持使用状态。UNIX socket FAQ在第2.7节中有一个非常长的解释。
为了测试目的,最好请求任意端口(或请求连续的端口,如8000、8001、8002等),并将该端口输出到控制台。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接