我正在编写一个PERL脚本,它捕获数据包,然后每秒生成有关所有TCP流的统计信息,这些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 line with data maintained by the pcap_callback function,
and go back to pcap_loop
你知道如何解决这个问题吗?我不确定我应该使用select,但我没有更好的主意,我是PERL的新手。我选择select的原因是,即使没有流量,我也需要生成统计信息。
例如,我想每秒打印传输的字节,然后我也需要生成总零线。
任何帮助将不胜感激:)
答案 0 :(得分:0)
我想我找到了答案,也许对其他人有用。
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,因此可以再次调用它。