anyevent::snmp+coro

本文介绍如何利用anyevent库和coro特性,结合Net::SNMP模块,实现并发获取多个设备的SNMP oid信息,包括sysuptime和sysDescr,通过异步调用优化网络设备信息收集效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

anyevent是基于事件和回调的格式,有时候用起来不太方便.

结合coro变成同步方式就容易理解一些.

 

#/usr/bin/env perl
#测试anyevent::snmp+coro
#测试取多个oid

use Coro;
use AnyEvent;
use AnyEvent::SNMP;
use Net::SNMP;



my $cocurrent = 1;    # 并发数
#my @todoList = map { "192.168.6." . $_ } (1 .. 254); #
my @todoList = ("192.168.6.87","192.168.6.25","192.168.6.45"); #

my $oid=".1.3.6.1.2.1.1.3.0";  #sysuptime
my $oid1=".1.3.6.1.2.1.1.1.0";  #sysDescr

my @coro;

#my $cv = AnyEvent->condvar;


doit() foreach 1..$cocurrent;

sub doit{
    my $ip = shift @todoList;
    return if not defined $ip;


     my $sess=Net::SNMP->session (-hostname => $ip,
                     -community => "public",
                     -timeout => 1,
                     -nonblocking => 1,
                     -translate   => [-timeticks => 0x0]
                     );
                     
   #先取sysuptime                     
   push @coro, async {
   	  #print "$ip.\n";
   	
                     
          my $ret=$sess->get_request (
           -varbindlist => [ $oid ],
           #-varbindlist      => \@oids, 
           -callback => Coro::rouse_cb
       );
       
   	    #my @result = Coro::rouse_wait;
   	     my ($session) = Coro::rouse_wait;
        my $result = $session->var_bind_list();

      if (!defined $result) {
         printf "ERROR: Get request failed for host '%s': %s.\n",
                $session->hostname(), $session->error();
                
      }
      else{
          printf "The sysuptime for host '%s' is %s.\n",
          $session->hostname(), $result->{$oid};
      
          
           #继续取sysDescr
           #print "$ip.\n";
          #push @coro, async {
           	
        
          	         
           my $ret=$sess->get_request (
             -varbindlist => [ $oid1 ],
             -callback => Coro::rouse_cb
           );
           my ($session) = Coro::rouse_wait;
           my $result = $session->var_bind_list();

			      if (!defined $result) {
			         printf "ERROR: Get request sysDescr failed for host '%s': %s.\n",
			                $session->hostname(), $session->error();
			                
			      }
			      else{
			          printf "The sysDescr for host '%s' is %s.\n",
			           $session->hostname(), $result->{$oid1};
			      }    
          #} 
      }        
      &doit();           
      
   }
}   
   
foreach (@coro) {
	#print "joining\n";
	$_->join;
	#print "joined\n";
};
   


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值