Perlでノンブロッキングなパケットキャプチャ

パケットキャプチャを取って分析する必要があったので、Perlでノンブロッキングでパケットキャプチャする方法調べてみた。
tcpdumpの出力を取るっていう方法もあるけど、自分でパースするのは面倒なのでCPANモジュールを使う。

AnyEvent::Pcap

Net::PcapのAnyEvent版。SYNOPSISのコードからして間違ってるので注意。

使い方
#!/usr/bin/env perl -w
use strict;
use AnyEvent::Pcap;
use AnyEvent::Pcap::Utils;

my $a_pcap = AnyEvent::Pcap->new(
    device         => "en1",
    packet_handler => sub {
        my $header = shift;
        my $packet = shift;

        my $tcp = AnyEvent::Pcap::Utils->extract_tcp_packet($packet);

    }   
);  

$a_pcap->run();

AnyEvent->condvar->recv;

__END__

Net::Frame::Dump::Online2

Net::Frame系のモジュールでノンブロッキングな実装。Net::Frame::Simpleが結構扱いやすい。

使い方
#!/usr/bin/env perl -w
use strict;
use Net::Frame::Dump::Online2;
use Net::Frame::Simple;

my $d = Net::Frame::Dump::Online2->new( dev => 'en1', );

$d->start;

while (1) {
    if ( my $f = $d->next ) {
        print Net::Frame::Simple->newFromDump($f)->print, "\n";
    }
}

$d->stop;

__END__