#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use Net::Pcap;
$| = 1; # autoflush stdout
my $dev = "eth1";
my $err = '';
my $pcap = Net::Pcap::open_live($dev, 1500, 1, 0, \$err);
die("open_live error upon open of $dev: $err") if !defined $pcap;
my $packet_counter = 0;
my $maxcap = 10;
# First try: just capture a few packets without any timeout:
loopy($maxcap, \&capture, \$packet_counter, "1");
# Second try: capture a few packets with timeout inside an eval
eval
{
local $SIG{'ALRM'} = \&AlarmHandler;
alarm 10;
loopy($maxcap, \&capture, \$packet_counter, "2");
alarm 0;
};
sub loopy
{
my ($cnt, $callback, $udata, $id) = @_;
print tim()."loop $id: listening...\n";
my $looprc = Net::Pcap::loop($pcap, $cnt, $callback, $udata);
if ($looprc == 0) { print tim()."loop $id: $cnt packets captured\n"; }
elsif ($looprc == -1) { print tim()."loop $id: error\n"; }
elsif ($looprc == -2) { print tim()."loop $id: breakloop (nothing captured)\n"; }
elsif ($looprc > 0) { print tim()."loop $id: breakloop ($looprc captured)\n"; }
else { print tim()."loop $id: unknown code $looprc\n"; }
}
sub capture
{
my ($user_data_ref, $header, $packet) = @_;
$$user_data_ref++;
print tim()."capture: got packet $$user_data_ref\n";
}
sub tim { localtime().": "; }
sub AlarmHandler
{
my $signal = shift;
print STDERR tim()."AlarmHandler: $signal signal received\n";
Net::Pcap::breakloop($pcap) if defined($pcap);
}
####
Mon Nov 9 11:09:16 2009: loop 1: listening...
Mon Nov 9 11:10:00 2009: capture: got packet 1
Mon Nov 9 11:10:00 2009: capture: got packet 2
Mon Nov 9 11:10:05 2009: capture: got packet 3
Mon Nov 9 11:10:05 2009: capture: got packet 4
Mon Nov 9 11:10:19 2009: capture: got packet 5
Mon Nov 9 11:10:19 2009: capture: got packet 6
Mon Nov 9 11:10:22 2009: capture: got packet 7
Mon Nov 9 11:10:22 2009: capture: got packet 8
Mon Nov 9 11:10:24 2009: capture: got packet 9
Mon Nov 9 11:10:24 2009: capture: got packet 10
Mon Nov 9 11:10:24 2009: loop 1: 10 packets captured
Mon Nov 9 11:10:24 2009: loop 2: listening...
Mon Nov 9 11:10:34 2009: AlarmHandler: ALRM signal received
Mon Nov 9 11:10:34 2009: loop 2: breakloop (nothing captured)
####
Mon Nov 9 11:12:49 2009: loop 1: listening...
Mon Nov 9 11:13:12 2009: capture: got packet 1
Mon Nov 9 11:13:12 2009: capture: got packet 2
Mon Nov 9 11:13:17 2009: capture: got packet 3
Mon Nov 9 11:13:17 2009: capture: got packet 4
Mon Nov 9 11:14:15 2009: capture: got packet 5
Mon Nov 9 11:14:15 2009: capture: got packet 6
Mon Nov 9 11:14:20 2009: capture: got packet 7
Mon Nov 9 11:14:20 2009: capture: got packet 8
Mon Nov 9 11:15:20 2009: capture: got packet 9
Mon Nov 9 11:15:20 2009: capture: got packet 10
Mon Nov 9 11:15:20 2009: loop 1: 10 packets captured
Mon Nov 9 11:15:20 2009: loop 2: listening...
Mon Nov 9 11:15:25 2009: capture: got packet 11
Mon Nov 9 11:15:25 2009: capture: got packet 12
Mon Nov 9 11:15:30 2009: AlarmHandler: ALRM signal received
Mon Nov 9 11:15:30 2009: loop 2: breakloop (nothing captured) <== problem: should say 2 captured