如何关闭被终止的程序留下的打开的套接字?
- 2024-11-13 08:36:00
- admin 原创
- 19
问题描述:
我有一个 Python 应用程序,它打开一个简单的 TCP 套接字来与另一个主机上的 Python 应用程序进行通信。有时程序会出错,或者我会直接终止它,无论哪种情况,套接字都可能会保持打开状态一段时间(未知)。
下次我运行该程序时出现此错误:
socket.error: [Errno 98] Address already in use
现在程序总是尝试使用相同的端口,所以看起来好像端口仍然打开。我检查了一下,确信程序没有在后台运行,但我的地址仍在使用中。
那么,我如何手动(或以其他方式)关闭套接字/地址,以便我的程序可以立即重新使用它?
更新
根据 Mike 的回答,我查看了该socket(7)
页面并查看了 SO_REUSEADDR:
SO_REUSEADDR Indicates that the rules used in validating addresses supplied in a bind(2) call should allow reuse of local addresses. For AF_INET sockets this means that a socket may bind, except when there is an active listening socket bound to the address. When the listen‐ ing socket is bound to INADDR_ANY with a specific port then it is not possible to bind to this port for any local address. Argument is an integer boolean flag.
解决方案 1:
假设您的套接字名为s
...您需要socket.SO_REUSEADDR
在绑定到接口之前在服务器的套接字上进行设置...这将允许您立即重新启动 TCP 服务器...
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((ADDR, PORT))
解决方案 2:
您可能想尝试使用 Twisted 进行网络连接。Mike 给出了正确的低级答案,SO_REUSEADDR
但他没有提到这不是在 Windows 上设置的很好的选项。这是 Twisted 自动为您处理的事情。还有许多其他此类无聊的低级细节示例,当直接使用套接字模块时您必须注意这些细节,但如果您使用 Twisted 等更高级的库,您可以忘记这些细节。
解决方案 3:
您混淆了套接字、连接和端口。套接字是连接的端点,而连接又是 5 元组 {协议、本地 IP、本地端口、远程 IP、远程端口}。被杀死的程序的套接字已被操作系统关闭,连接也是如此。连接的唯一遗留是对等端的套接字和对等端主机上的相应端口。因此,您真正应该问的是如何重用本地端口。根据其他答案,答案是 SO_REUSEADDR。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD