Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 每秒在pcap_循环期间生成统计信息_Perl_Nonblocking_Libpcap_Period - Fatal编程技术网

Perl 每秒在pcap_循环期间生成统计信息

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

我正在编写一个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 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,以便可以再次调用它