Wireshark-dev: [Wireshark-dev] continuous packet capture
From: Jon Polacheck <jonpol@xxxxxxxxxxxxx>
Date: Thu, 05 Mar 2009 12:36:32 -0600
I am working on a continuous packet capture application (think Infinistream, Gigastor, NetVCR) written in Perl (only because that's what I know). Here is what I have so far. This works (or seems to). More optimization possible by removing unnecessary trailing spaces from each packet hexdump. Hacked Data::Hexdumper some, more probably doable. Used mkfifo to create the named pipe. Perl sees it as a disk file(that I called qtfifo). ENQUE.pl dumps packet hexdumps to the fifo. DEQUE.pl reads lines from the fifo. /^0000 / acts as the delimiter. mysql compression worked with the standard OpenSuSE install, no recompiling or other mucking about necessary.
Lines used for debugging marked as such. ENQUE.pl use Net::Pcap; use Data::Hexdumper qw(hexdump); $dev = "eth0"; # used a 50 packet cap file to make sure what came out matched what went in #$dump = "ip.cap"; #$pcap = Net::Pcap::open_offline($dump, \$err) or die "Can't read '$dump': $err\n"; # live, real-time feed $pcap = Net::Pcap::open_live($dev, 1514, 1, 0, \$err); Net::Pcap::loop($pcap, -1, \&process_pkt, ""); # <- subroutine call sub process_pkt { open(QT, "> qtfifo"); # $_[2] is the third element of the default array "@_" which was created # by the subroutine call "&process_pkt" my $pkt=$_[2]; $results = hexdump( data => $pkt , number_format => 'C', ); print QT $results; close(QT); $i++; # debug &stop_run if $i > 100; #debug } # all debug below sub stop_run { print "stop_run\n"; open(QT, "> qtfifo"); print QT "\nx\n"; close(QT); print "enque ended\n"; exit; } DEQUE.pl use Time::HiRes ( nanosleep ); use DBI; $hostname="127.0.0.1"; $database="cpc"; $port="3306"; $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port"; $dbh = DBI->connect($dsn, "root", "", {'RaiseError' => 1}); # call the Net::Packet collector script system(q{perl ENQUE.pl&}); open(EQT, " < qtfifo"); $i = 0; # debug $pc = 0; # debug while(1) { $i++; # debug $line = readline(EQT); if ($line =~ /^0000 / ) { $dbh->do(qq{INSERT INTO cpc VALUES ( compress("$pkt"))}); $pc++ if defined($pkt); # debug print "packet $pc:\n$pkt\n" if defined($pkt); # debug undef($pkt); $pkt .= $line; } else { $pkt .= $line; &theend if $pkt =~ /x/; # debug } nanosleep(1); # would not work without this! } # all debug below sub theend { close(EQT); print "$i loops\ndeque ended\n"; exit; } This generated a cap file that looks just fine in Wireshark. mysql -Br -D cpc -e "select uncompress(packet) from cpc;" | text2pcap - m_cap.cap Hope you find this of interest. Jon Polacheck
- Follow-Ups:
- Re: [Wireshark-dev] continuous packet capture
- From: Brian Daniel
- Re: [Wireshark-dev] continuous packet capture
- Prev by Date: [Wireshark-dev] OS X Install Issues
- Next by Date: Re: [Wireshark-dev] Reassembling splitted PPP packets
- Previous by thread: Re: [Wireshark-dev] OS X Install Issues
- Next by thread: Re: [Wireshark-dev] continuous packet capture
- Index(es):