【问题标题】:How can I check which method of checking a port state is more efficient?如何检查哪种检查端口状态的方法更有效?
【发布时间】:2013-08-14 02:15:47
【问题描述】:

我正在编写一个脚本来安排我的一些服务器上的端口检查,并报告状态。我打算选择以下两种选择之一:

  1. 将 netcat (nc) 的输出通过管道传递到 perl 变量中,并检查返回状态

    my $rcode=`nc -z 6.6.6.6 80; echo $?`
    
  2. 使用 perl 模块 IO::Socket::PortState 来做同样的事情。

    use IO::Socket::PortState qw(check_ports);
    my %porthash = ( ... );
    check_ports($host,$timeout,\%porthash);
    print "$proto $_ is not open ($porthash{$proto}->{$_}->{name})
        if !$porthash{$proto}->{$_}->{open};    
    

我想走更高效(时间更短,更具体)的路线。

这方面有经验法则吗?就像在管道中一样,系统命令/unix 实用程序的输出比使用 perl 模块效率更高/更低?还是不同的 perl 模块不同,只有通过设置这些检查的多次迭代并比较执行 unix 实用程序的系统调用所花费的时间,才能检查相同的模块?

【问题讨论】:

  • 是的。经验法则是对其进行基准测试。
  • 基准测试——当然。我只想补充一点,您应该明确说明“高效”的含义。
  • 我的意思是节省时间和精确(更少的错误值)。
  • 你可以考虑使用Socket;直接地。因为这是 perl 的基线套接字实现,并且是来自 c 的近乎直接的映射,所以它应该是在 perl 中执行此操作的最佳方法。尽管此时您可能很容易用 C 语言编写它,但 Socket.pm 与 socket.h 非常接近

标签: perl unix tcp port perl-module


【解决方案1】:

这与其说是对您的问题的真正答案,不如说是一个建议的实现。

快速运行一个使用 Socket.pm 的未经测试的示例。

这可能是最快的 perl 实现。但是在您使用 socket.pm 的时候,您也可以使用 socket.h 用 C 语言编写它。它们是近乎 1:1 的映射。

参考:

#!/usr/bin/perl -w

use Socket;

$remote  = $ARGV[0];
$port    = $ARGV[1];

print ":: Attempting to connect to - $remote.\n";
$iaddr = inet_aton($remote) or die "Error: $!";
$paddr = sockaddr_in($port, $iaddr) or die "Error: $!";
$proto = getprotobyname('tcp') or die "Error: $!";

socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "Error: $!";
connect(SOCK, $paddr) or die "Error: $!";

print ":: Connected Successfully!\n";

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2023-01-04
    • 2019-06-03
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多