服务器套接字松绑定

3
我希望能够开发主服务器和辅助服务器。
当主服务器宕机时,辅助服务器应该在同一个端口上启动。
但是当主服务器准备开始时,辅助服务器应该优雅地停止,以便主服务器可以在同一个端口上启动。 有没有办法让辅助服务器知道另一个进程正在尝试在同一个端口上启动?

2
谁投票将此关闭为“不是一个真正的问题”,只是显示了他们自己的无知。 - Chris Stratton
1
哦,主服务器和从服务器在同一台机器上?那是相当奇怪的设置。 - fge
编辑以突出所问的具体、实际问题 - Chris Stratton
2个回答

3
如果您需要服务器一直在线,可以按照以下方法进行:
创建一个父进程,它将生成一个子进程来监听端口并提供实际服务。当子进程正在处理请求时,父进程会使用C语言中的waitpid等待子进程死亡(崩溃/状态更改)。因此,每当子进程关闭时,父进程就知道并生成新的进程——这是首选方法。
如果您需要特定的主-从设计:
当从服务器正在提供服务时,它可以始终等待主服务器发出信号。因此,当主服务器启动时,它的第一个任务将是在发现从服务器已经启动(通过pid文件、文件锁或绑定失败)时向从服务器发送该信号,以便从服务器可以优雅地关闭。

有趣的是,如果次要进程是主进程的启动父进程,并且它可以使用类似于sigchild的东西来判断主进程是否已经停止运行呢? - Chris Stratton
1
类似于这样。我个人设计了一个服务器,其中父进程只监视子进程,并使用sigchild在其关闭时重新启动它们。 - VoidPointer

1

我不认为有一种直接的方法可以检测到进程正在尝试监听给定端口,除非使用像ptrace这样的调试器挂钩或更可能使用LD_PRELOAD进行共享库替换来拦截实际尝试。

但是,如果您可以修改源代码,您可以相当容易地让一个进程通知另一个进程,并请求它慷慨地让出位置。您可以使用各种进程间通信方式进行此操作,例如在正在侦听的端口上与其联系(请注意安全性影响),在不同的端口上与其联系(仅侦听环回接口!),在Unix域套接字上与其联系等等。

要确定另一个进程是否已经在侦听,请使用netstat或直接从/proc导出的信息查看正在使用的套接字。

请注意,除非原始服务器使用了SO_REUSEADDR标志,否则在不同进程可以声明该端口之前,您可能会遇到超时。这可能要求在备用端口上运行备份,并要求客户端将其作为后备方案尝试。或者,您可以使用一个简单的进程作为端口转发器,以连接两个服务器的唯一端口之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接