#!/usr/bin/perl use Net::Pcap; $|=1; $nargs=@ARGV; if ($nargs != 3){ die "ddpcap \n"; } $source = $ARGV[0] ; $seg = $ARGV[1] ; $seq = 0; $count = $ARGV[2] ; $unit = chop($count); unless ($unit =~ /[bpsm]/){ die "invalid qualifier: \"$unit\"\n"; } die "i can't find the source file \"$source\"\n" unless ( -e $source ); if ($unit =~ /m/){ $unit = "s"; $count *= 60 ; } $fp_time = 0; $done = 0; $pcap_ifd = Net::Pcap::open_offline($source, \$err); while (!$done){ $c = 0; $fp_time = 0; $name = sprintf("%s_%06d.tcp",$seg,$seq); $pcap_ofd = Net::Pcap::open_offline($name, \$err); $pcap_ofd_dumper = Net::Pcap::dump_open($pcap_ifd, $name); $seq++; print "dumping to $name.\n"; do { $pkt_data = Net::Pcap::next($pcap_ifd, \%pkt_hdr); if($pkt_data eq "" ){ $done = 1; Net::Pcap::close($pcap_ifd); print "closed $name.\n"; exit; } &calculate; Net::Pcap::dump($pcap_ofd_dumper, \%pkt_hdr, $pkt_data); } while ( $c < $count ); Net::Pcap::dump_close($pcap_ofd_dumper); print "closed $name.\n"; } # ---------------------------------------------------------------- sub calculate{ if($unit =~ /s/){ if ($fp_time == 0){ $fp_time = $pkt_hdr{tv_sec}; } $c = $pkt_hdr{tv_sec} - $fp_time; #seconds } elsif($unit =~ /b/){ $c += $pkt_hdr{len} ; #bytes } else { $c++ ; #packets } } # ----------------------------------------------------------------