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

7 投票
2 回答
9850 浏览
提问于 2025-04-17 04:19

我正在学习如何在Python中使用套接字(socket),但我发现每当我的程序崩溃或者我按下Ctrl+C来停止服务器时,套接字似乎还在继续监听那个端口。这显然会导致当我重新启动程序时,它无法再在那个端口上监听,所以我不得不不断地更改端口。

我在想,我是不是需要在某个地方调用socket.close()来关闭它,但我该在哪里调用呢?

2 个回答

1

结束一个程序会自动关闭它所有的连接口(也就是“套接字”)。不过,TCP端口在这之后仍然会被保留在使用状态。关于这个问题,UNIX套接字常见问题解答的第2.7节有很长的解释。

为了测试,最好是请求一个任意的端口(或者依次请求,比如8000、8001、8002等),然后在控制台上输出这个端口。

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)

撰写回答