Java 服务器套接字松散绑定

Java 服务器套接字松散绑定,java,c,linux,linux-kernel,Java,C,Linux,Linux Kernel,我想开发主服务器和辅助服务器 当主服务器停机时,辅助服务器应位于同一端口上 但当主服务器准备启动时,辅助服务器应该正常停止,以便主服务器可以在同一端口上启动 辅助服务器是否有办法知道另一个进程正试图在同一端口上启动?如果您需要的是始终启动服务器,您可以使用此方法 创建一个父进程,该进程将通过侦听端口生成一个子进程来执行实际服务。当child服务于实际请求时,父级将使用C中的waitpid等待child死亡(崩溃/状态更改)。所以,无论孩子何时下楼,父母都知道并产生新的过程首选方法 如果您特别需

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

当主服务器停机时,辅助服务器应位于同一端口上

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


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

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

创建一个父进程,该进程将通过侦听端口生成一个子进程来执行实际服务。当child服务于实际请求时,父级将使用
C
中的
waitpid
等待child死亡(崩溃/状态更改)。所以,无论孩子何时下楼,父母都知道并产生新的过程首选方法


如果您特别需要掌握二次设计


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

我不相信有直接的方法可以检测到进程正在尝试侦听给定端口,使用诸如ptrace之类的调试器钩子拦截实际尝试,或者更可能使用LD_PRELOAD进行共享库替换

然而,如果您可以修改源代码,那么您可以很容易地让一个流程通知另一个流程,并请求它让开。您可以使用各种进程间通信方式来实现这一点,例如在它正在侦听的端口上与它联系(注意安全隐患)、在其他端口上与它联系(仅在环回接口上侦听!)、在unix域套接字上与它联系,以及许多其他选择

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


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

无论是谁投票认为这不是一个真正的问题,这只是表明他们自己的无知。嗯,主服务器和从服务器在同一台机器上?这是一个非常奇怪的设置,用来突出被问到的具体的、真实的问题。有趣的是,如果次要系统是主要系统的启动父系统,它可以使用类似sigchild的东西来判断它是否死亡?类似于此。我个人将服务器设计为具有父级和子级,其中父级仅使用
sigchild
监视子级,并在每次发生故障时生成它。