Nosing around in the mailing list archive I find;

"Re: Prioritizing Event Loops

Martijn van Beers
Fri, 18 Jan 2008 11:37:22 -0800
<snip>
In POE, all your external data, whether from a socket or a file, or
something else entirely, enters your app through a POE::Wheel (you might
not be aware of having one, since it is mostly hidden inside
POE::Component::Server::TCP). How the wheel gets the data is supposed to be
abstracted away.
</snip>"

So POE::Component::Pcap is a wheel?

Jon

__________________

Brad,

Great stuff.  Thanks.  I'm going on the assumption that $inst->[1] (line
94) is the raw packet, headers and all.  I plan to test by pointing pcap at
a capture file and comparing output to input.  My next plan is to add a sql
insert of $hexpacket at line 108.  My goal is to keep up with an incoming
data stream of 20-30 k-bytes a second.  After the hex data is safely stored
in the database I can go back and insert whatever fields (layer 3-4, packet
length, etc) I want.  Then do a gui to extract traces and do other analysis
from the stored data.   Here is my code;

  1  use strict;
  2  use warnings;
  3
  4  use Data::Dumper;
  5  use Carp;
  6
  7  #
  8  # POE Environment
  9  # use POE qw(
 10  #      Component::Pcap
 11  #      Component::Daemon
 12  # );
 13
 14  use POE qw(
 15   Component::Pcap
 16  );
 17
 18  #
 19  # PCAP Options
 20  my %pcap_opts = (
 21   dev         => 'eth0',
 22   snaplen           => 1514,
 23   promisc           => 1,
 24   timeout           => 100,
 25  );
 26
 27  #------------------------------------------------------------------------#
 28  # POE Environment Setup
 29  #------------------------------------------------------------------------#
 30  #POE::Component::Daemon->spawn( detach => 1, babysit => 600, max_children 
=> 5 );
 31
 32  POE::Session->create(
 33   inline_states     => {
 34         _start                  => \&start_processor,
 35         _stop             => \&stop_processor,
 36         handle_packet           => \&handle_packet,
 37   },
 38  );
 39
 40  $_[HEAP]->{i} = 0;
 41
 42  #------------------------------------------------------------------------#
 43  # Run the POE Sessions
 44  #------------------------------------------------------------------------#
 45  POE::Kernel->run;
 46
 47  #------------------------------------------------------------------------#
 48  exit 0;
 49  #------------------------------------------------------------------------#
 50
 51  #------------------------------------------------------------------------#
 52  # Start the Processor
 53  sub start_processor {
 54   my ($kernel, $heap) = @_[KERNEL, HEAP];
 55
 56   $kernel->alias_set('processor');
 57
 58   #
 59   # Start Packet Capturing
 60   POE::Component::Pcap->spawn(
 61         Alias       => 'pcap',
 62         Device            => $pcap_opts{dev},
 63         Dispatch    => 'handle_packet',
 64         Session           => 'processor',
 65   );
 66   $kernel->post( pcap => open_live => @pcap_opts{qw(dev snaplen promisc 
timeout)} );
 67
 68   $kernel->post( pcap => 'run' );
 69  }
 70  #------------------------------------------------------------------------#
 71
 72  #------------------------------------------------------------------------#
 73  # stop the processor
 74  sub stop_processor {
 75   my ($kernel,$heap) = @_[KERNEL,HEAP];
 76
 77   #
 78   # Stop pcap
 79   $kernel->post( 'pcap' => 'shutdown' );
 80  }
 81  #------------------------------------------------------------------------#
 82
 83  #------------------------------------------------------------------------#
 84  sub handle_packet {
 85   my $offset = 0;
 86   my $linechars = 0;
 87   my $hexpacket;
 88
 89   $_[HEAP]->{i}++;
 90   print "sub handle_packet called $_[HEAP]->{i} times\n";
 91   my ($kernel,$heap,$packets) = @_[KERNEL,HEAP,ARG0];
 92
 93   foreach my $inst ( @{ $packets } )  {
 94         foreach my $char (split(//, $inst->[1])) {
 95               if ( $linechars == 0 ) {
 96                     $hexpacket .= sprintf( "%04X ", $offset );
 97               }
 98               $linechars++;
 99               $hexpacket .= sprintf( "%02X ", ord($char) );
100               if ( $linechars == 16 ) {
101                     $hexpacket .= "\n";
102                     $linechars = 0;
103                     $offset += 16;
104               }
105         }
106         $hexpacket .= "\n\n";
107   }
108   print $hexpacket;
109   undef($hexpacket);
110  }
111
112  #------------------------------------------------------------------------#

Reply via email to