Perl 每秒在pcap_循环期间生成统计信息
我正在编写一个PERL脚本,它捕获数据包,然后每秒钟生成关于所有TCP流的统计数据,这些数据在那一秒钟是在线的。 我正在使用NET::Pcap,我想以某种方式实现它,如果可能的话,不使用线程。我试过使用select()和pcap_breakloop(),但它似乎不起作用 我在想:Perl 每秒在pcap_循环期间生成统计信息,perl,nonblocking,libpcap,period,Perl,Nonblocking,Libpcap,Period,我正在编写一个PERL脚本,它捕获数据包,然后每秒钟生成关于所有TCP流的统计数据,这些数据在那一秒钟是在线的。 我正在使用NET::Pcap,我想以某种方式实现它,如果可能的话,不使用线程。我试过使用select()和pcap_breakloop(),但它似乎不起作用 我在想: ... $pcap = pcap_open_live($dev, 1024, 1, 0, \$err); select($pcap, undef, undef, 1) if 1 sec elapsed print a
...
$pcap = pcap_open_live($dev, 1024, 1, 0, \$err);
select($pcap, undef, undef, 1)
if 1 sec elapsed print a line with data maintained by the pcap_callback function,
and go back to pcap_loop
你知道如何解决这个问题吗?我不确定是否应该使用select,但我没有更好的主意,我对PERL还不熟悉。我选择select的原因是,即使没有流量,我也需要生成统计数据
例如,我希望每秒打印传输的字节,然后我还需要生成总的零行
任何帮助都将不胜感激:)我想我已经找到了答案,也许它对其他人会有用
my $dev = Net::Pcap::pcap_lookupdev(\$err);
print "Capturing on: $dev\n";
my $pcap = pcap_open_live($dev, 1024, 1, 0, \$err);
if ($pcap eq NULL) {
print "Could not capture on $dev. Terminating...\n";
return 0;
}
my $main_loop = Glib::MainLoop->new;
Glib::IO->add_watch (pcap_get_selectable_fd($pcap), [qw/in/], \&watch_callback, $pcap);
Glib::Timeout->add (1000, \&stats_callback, undef, 1 );
$main_loop->run;
print "Closing pcap...\n";
pcap_close($pcap);
sub watch_callback {
Net::Pcap::pcap_dispatch($pcap, -1, \&process_packet, "");
return 1;
}
sub stats_callback{
#generate statistic...
return 1;
}
sub process_packet {
my ($user_data, $header, $packet) = @_;
my $ether_data = NetPacket::Ethernet::strip($packet);
...
}
确保回调函数的默认返回值为true,以便可以再次调用它