服务器套接字松散绑定

时间:2013-06-20 17:00:32

标签: java c linux linux-kernel

我想开发主服务器和辅助服务器。

当主服务器关闭时,辅助服务器应该出现在同一个端口上。

但是当主服务器准备启动时,辅助服务器应该正常停止,以便主服务器可以在同一端口上启动。

辅助服务器有没有办法知道另一个进程正在尝试在同一个端口上启动?

2 个答案:

答案 0 :(得分:3)

如果您需要的是始终使用您的服务器,您可以按照此方法

创建一个父进程,通过侦听端口来生成子进程以执行实际服务。当孩子正在提供实际请求时,父母将使用waitpid中的C等待孩子死亡(崩溃/状态更改)。因此,每当孩子沮丧时,父母就会知道并产生新的过程。 - 首选方法


如果您需要特别是主辅设计,

当辅助服务请求时,它总是可以等待来自主服务器的信号。因此,当master启动时,它的第一个任务就是在发现辅助服务器启动时(通过pid文件或文件锁定或绑定失败)将该信号发送到辅助服务器,以便辅助服务器可以正常关闭。

答案 1 :(得分:1)

我不相信有一种直接的方法来检测该进程尝试监听给定端口,而不是通过调试器挂钩(如ptrace)拦截实际尝试,或者更可能使用LD_PRELOAD共享库替换。

但是,如果你可以修改源代码,你可以很容易地让一个进程通知另一个进程,并要求它完全避开。您可以使用各种进程间通信方式来完成此操作,例如在它正在侦听的端口上联系它(注意安全隐患),在不同的端口上联系它(仅在环回接口上监听!),在unix域上联系它socket和许多其他选择。

要判断另一个进程是否已在侦听,您可以使用netstat或直接使用/ proc导出的信息来查看正在使用的套接字。

请注意,除非原始服务器使用SO_REUSEADDR标志,否则在其他进程可以声明该端口之前可能会超时。这可能是为了在备用端口上运行备份,并让客户端尝试将其作为备用。或者有一个简单的过程,它作为两个服务器的唯一端口之一的端口转发器。