0

我正在尝试使用 Net::SNMPTrapd 中包含的示例脚本,但它在 Socket 例程上失败。我的代码:

#!/usr/bin/perl
use Net::SNMPTrapd;

my $snmptrapd = Net::SNMPTrapd->new()
  or die "Error creating SNMPTrapd listener: ", Net::SNMPTrapd->error;

while (1) { 
    my $trap = $snmptrapd->get_trap();

    if ( !defined($trap) ) {
        printf "$0: %s\n", Net::SNMPTrapd->error;
        exit 1 
    } elsif ( $trap == 0 ) {
        next
    } 

    if ( !defined( $trap->process_trap() ) ) {
        printf "$0: %s\n", Net::SNMPTrapd->error
    } else { 
        printf "%s\t%i\t%i\t%s\n",
          $trap->remoteaddr,
          $trap->remoteport,
          $trap->version,
          $trap->community
    } 
} 

当我运行它并从我的 Cisco 路由器向它发送一个 v2 陷阱时,它只是转储:

Undefined subroutine &Net::SNMPTrapd::pack_sockaddr_in called at /usr/local/share/perl/5.14.2/Net/SNMPTrapd.pm line 554.

谁能告诉我如何解决这个问题?

4

1 回答 1

0
use Socket qw(inet_ntoa AF_INET IPPROTO_TCP);

应该

use Socket qw(inet_ntoa AF_INET IPPROTO_TCP pack_sockaddr_in);

解决方法

改变

use Net::SNMPTrapd;

use Net::SNMPTrapd;
BEGIN {
   *Net::SNMPTrapd::pack_sockaddr_in = \&Socket::pack_sockaddr_in
      if !defined(&Net::SNMPTrapd::pack_sockaddr_in);
}

即使模块的作者解决了这个问题,这也不会中断(在你向他提及之后......)

于 2013-01-29T03:43:41.400 回答