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

Posted

技术标签:

【中文标题】在退出/崩溃时关闭服务器套接字【英文标题】:Close server socket on quit/crash 【发布时间】:2011-12-07 16:22:45 【问题描述】:

我正在学习如何在 python 中使用套接字,并且经常当我的程序崩溃或我 Ctrl+C 时,服务器套接字会以某种方式一直监听端口。这显然会阻止程序在重新启动时侦听该端口,所以我必须不断更改它。

我猜我需要在某个地方做 socket.close(),但是在哪里呢?

【问题讨论】:

【参考方案1】:

你可以试试atexit 模块。

import atexit

function close_socket:
    s.close()

atexit.register(close_socket)

如果问题是在测试期间端口可用的延迟,我建议设置SO_REUSEADDR,这将允许端口立即再次绑定,而不是等待 TCP 堆栈上的超时。

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

【讨论】:

【参考方案2】:

终止程序会使其所有套接字自动关闭。但是,此后 TCP 端口仍在使用中。 UNIX socket FAQ 在第 2.7 节中有很长的解释。

出于测试目的,最好请求任意端口(或请求连续的端口,例如 8000、8001、8002...)并在控制台中输出该端口。

【讨论】:

以上是关于在退出/崩溃时关闭服务器套接字的主要内容,如果未能解决你的问题,请参考以下文章

当我关闭蓝牙服务器套接字或蓝牙套接字时,Android 应用程序意外退出

关闭并退出时崩溃

客户端断开连接时套接字服务器崩溃

如何关闭在while循环中的线程中侦听的阻塞套接字?

自己用C语言构造数据包,实现TCP三次握手过程,为啥中间会产生一个RST信号?

如何关闭 python asyncio 传输?