2013-03-28 63 views
0

我正在編寫一個捕獲數據包的PERL腳本,然後在每秒鐘內生成有關所有TCP數據流的統計信息,這些數據流在第二秒內聯機。 我正在使用NET :: Pcap,我想以某種方式實現這一點,並且如果可能的話,不使用線程。我嘗試過使用select()和pcap_breakloop(),但它並沒有用於工作。每秒在pcap_loop期間生成統計信息

我在想:

... 
$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

我想我已經找到了答案,也許這將是對其他有用的。

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,因此可以再次調用它。