退出/崩溃时关闭服务器套接字
我正在学习如何在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)