#!/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