根据
SteffenUlrich
,我看了一下
NetPacket::IP
,通过它为我做了
decode()
方法在将其烘焙到我的代码中后,它的工作非常简单,唯一的警告是前四个字节必须来自原始数据(请参见下面的惰性正则表达式),因为这些字节形成了TunTap层添加的附加标头。
我的代码现在看起来像这样,并按预期工作:
#!/usr/bin/perl
use warnings;
use strict;
use Linux::TunTap;
use NetPacket::IP;
$tun = new Linux::TunTap(NAME => 'localtun')
or die "Couldn't connect to IF\n";
while (my $rawdata = $tun->get_raw()) {
$rawdata =~ s/^....//; # Using regex to strip 4 bytes, because I'm lazy
my $packet = NetPacket::IP->decode($rawdata);
print "$packet->{id} $packet->{src_ip} -> $packet->{dest_ip} $packet->{proto} $packet->{len}\n";
}
上面的代码打印序列、源IP、目标IP、协议号和数据包长度。