1

我正在编写一个程序,它在进程之间创建一个网络,其中一个就像一个“协调器”。协调器应该能够检查网络中的其他进程是死的还是活的。我编写了一个例程(由一个线程永久执行),通过查看进程是否正在侦听多播端口(多播端口是指同一多播组的进程之间的公共端口,比如说 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”,它仍然会打印相同的内容。(因此,它永远不会识别进程何时死亡)。

我看不出问题是什么,如果我使用非多播端口这样做,它会完美运行,所以我猜它必须与它是多播端口的事实有关。

有没有办法让它与那种端口一起工作?如果不可能,考虑到协调器必须检查很多进程,检查另一个进程是否处于活动状态的最佳方法是什么。

注意:假设所有多播的东西都工作正常(它以应有的方式发送消息)

4

1 回答 1

1

IO::Socket::PortState 的这个(6 年陈旧的)错误报告说,UDP 的检查被破坏了。

然而,由于库非常小——它实际上是一个大约 30 行的函数,而不是在项目中引入另一个依赖项,我会自己实现检查,可能使用 Perl 核心模块IO::Socket::INET

我不能告诉你如何正确地做到这一点,但是如果你阅读库代码,你会看到它是如何在库中完成的。但是,您仍然需要修复该错误以使 UDP 正常工作。之后,考虑为库创建一个补丁并将其发送给维护者(使用模块页面上的链接)。

关于检查的一些更一般的注意事项:

如果要检查机器是否可访问(即在线和可路由),来自互联网层的 ICMP(ping)就足够了。除非您正在探测您愿意与之通信的同一个端口,否则使用更高层不会告诉您更多信息,并且会花费更多开销(至少对于 TCP,也许对于 UDP 更好,但仍然更多。)

稍后当您回到这一点并尝试实施更多“正确”检查时,我建议您阅读Nmap 站点上的端口扫描基础知识。(想想看,CPAN 中还有一个 Nmap 库,那绝对是一个用来射苍蝇的火箭筒。)

于 2013-07-18T02:43:41.710 回答