perl - 绑定(bind)到 perl 中的接口(interface)

标签 perl sockets

好的,所以我正在查看 perls Socket 模块,但它似乎不支持监听接口(interface)上的所有流量......比如说 eth1。

我基本上是将核心路由器上的所有流量转储到 linux 机器上,但这不是通过 ip 完成的。我可以使用 tcpdump 观察所有流量,并且可以围绕它构建一个包装器,但我宁愿 perl 实际监听接口(interface)并解析所有流量。有任何想法吗?

最佳答案

如果你想实现某种数据包捕获系统,你不想使用普通的 IP 层。相反,你会想要一个 PF_PACKET socket 。

为此,您可能希望使用 IO::Socket::Packet .例如,引用提供的示例程序 capture.pl :

#!/usr/bin/perl

use strict;
use warnings;

use IO::Socket::Packet;
use Socket::Packet qw(
   PACKET_OUTGOING
);

my $sock = IO::Socket::Packet->new( IfIndex => 0 )
   or die "Cannot create PF_PACKET socket - $!";

while( my ( $proto, $ifindex, $hatype, $pkttype, $addr ) = $sock->recv_unpack( my $packet, 8192, 0 ) ) {
   my ( $ts, $ts_usec ) = $sock->timestamp;
   my @ts = localtime $ts;
   printf "[%4d/%02d/%02d %02d:%02d:%02d.%06d] ", $ts[5]+1900, $ts[4]+1, @ts[3,2,1,0], $ts_usec;

   # Reformat nicely for printing
   $addr = join( ":", map sprintf("%02x", ord $_), split //, $addr );

   if( $pkttype == PACKET_OUTGOING ) {
      print "Sent a packet to $addr";
   }
   else {
      print "Received a packet from $addr";
   }

   printf " of protocol %04x on %s:\n", $proto, $sock->ifindex2name( $ifindex );

   printf "  %v02x\n", $1 while $packet =~ m/(.{1,16})/sg;
}

关于perl - 绑定(bind)到 perl 中的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23161193/

相关文章:

perl - 如何计划由外部子运行的额外测试?

perl - 使用 Mojo::DOM 在标题后提取未标记的文本

perl - 使用 Perl here-document 导致 "Can' t 在 EOF 之前的任何位置找到字符串终止符 "EOF"”

javascript - UDP多广播nodejs

javascript - 如何使用需要套接字连接的中间件?

c# - .net35的socket.ConnectAsync

xml - 我希望 XML::Twig 准确地打印出解析的内容

mysql - Perl 代码始终连接到同一个 MySQL 数据库,尽管它被配置为连接到不同的服务器

c++ - IPv6 连接错误 WSAEAFNOSUPPORT

c++ - 取消或只是适本地阻止套接字上的任何 future 异步操作