我正在编写一个程序,它在进程之间创建一个网络,其中一个就像一个“协调器”。协调器应该能够检查网络中的其他进程是死的还是活的。我编写了一个例程(由一个线程永久执行),通过查看进程是否正在侦听多播端口(多播端口是指同一多播组的进程之间的公共端口,比如说 2000)和连接来检查这一点发送消息时使用“udp”协议)使用IO::Socket::PortState:
my %port_hash = ( udp => {'2000' => {} } );
my $timeout = 5;
while (1) {
# checking system node
my $host_hr = check_ports($node_host, $timeout, \%port_hash);
my $isAlive = $host_hr->{udp}{'2000'}{open};
if (!$isAlive) {
print "$node_host died";
} else { print "Everything OK with $node_host"; }
}
然后,当我提升两个或更多进程时,它工作正常,它显示“host_X 一切正常”,但如果我终止节点“host_X”,它仍然会打印相同的内容。(因此,它永远不会识别进程何时死亡)。
我看不出问题是什么,如果我使用非多播端口这样做,它会完美运行,所以我猜它必须与它是多播端口的事实有关。
有没有办法让它与那种端口一起工作?如果不可能,考虑到协调器必须检查很多进程,检查另一个进程是否处于活动状态的最佳方法是什么。
注意:假设所有多播的东西都工作正常(它以应有的方式发送消息)