gpt4 book ai didi

linux - Linux 上的 TIME_WAIT 和 EADDRINUSE

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:53 26 4
gpt4 key购买 nike

我有一个系统,其中在后台运行的服务器进程由控制程序控制。

控制程序是一个简单的脚本,它执行一个命令然后退出。对于 Run 命令,它会创建一个新的服务器进程;对于其他(包括关机),它通过保留的控制端口将命令发送到服务器。

控制程序创建一个套接字,连接到服务器的控制端口,发送一个数据字符(命令),从套接字中读取回复,关闭套接字,向用户显示回复并退出。服务器接受控制套接字上的连接,读取数据字符,发送回复,关闭子套接字并继续监听。当服务器关闭时,它也会关闭父控件套接字。

这已经在 Windows XP/Python 2.6.6 上工作了很多年。最近我们尝试移植到 Linux(Ubuntu 16.04.2 GNU/Linux 4.4.0-62-generic x86_64/Python 2.7.12),但是重启命令(关机后立即运行)失败:当新的服务器进程尝试将控制套接字绑定(bind)到控制端口,它获得 EADDRINUSE。

netstat 的输出显示用于 Shutdown 命令的连接仍处于 TIME_WAIT 状态,并持续了大约两分钟。

我已经回顾了以前关于这个主题的帖子。我尝试在服务器的控制套接字上设置 SO_REUSEADDR 和/或 SO_REUSEPORT。我曾尝试增强服务器和控制程序之间的协议(protocol),以确保控制程序首先关闭其连接端,但到目前为止,我还没有找到有效的组合。请问有没有解决办法。

鉴于服务器和控制程序都在同一台机器上运行,连接双方的详细信息将在操作系统的状态表中,并且必须在 TIME_WAIT 中留下一个或另一个。

控制程序的条目是否阻止服务器绑定(bind)到端口?

我注意到在 Windows 上也有一个连接处于 TIME_WAIT 状态,但在 Windows 上这不会阻止新的服务器进程绑定(bind)到相同的控制端口。

最佳答案

我已经回答了我自己的问题。为了获得所需的行为,我需要在服务器的控制套接字(仅)上设置 SO_REUSEADDR(仅)。没有必要使用 SO_REUSEPORT。无需对控制程序进行任何操作。哪一方先关闭连接没有区别。

我的第一次尝试没有成功,因为我犯了一个愚蠢的错误。 (我使用了错误的变量。)

关于linux - Linux 上的 TIME_WAIT 和 EADDRINUSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43844917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com