繁体   English   中英

如何使用 Perl 中的 IO::Socket 捕获传入的 UDP 流量?

[英]How can I capture incoming UDP traffic using IO::Socket in Perl?

我正在尝试监听并持续获取端口 162 上的传入 UDP 流量,如下所示,但是,我们似乎从未进入 while 循环。

通过端口 162 上的 tcpdump 可以看到流量,下面的 Perl 代码以 root 身份运行。 脚本似乎在等待和倾听,但从来没有任何 output。

肯定缺少一个关键位。 有任何想法吗?

use IO::Socket::INET;

# flush after every write
$| = 1;

my $received;
my ($peeraddress, $peerport);

my $socket = new IO::Socket::INET(
   LocalAddr => 'localhost',
   LocalPort => '162',
   Proto     => 'udp',
   Type      => SOCK_DGRAM,
) or die "ERROR in Socket Creation : $@\n";

while ( $socket->recv($received, 1024) ) {
   $peeraddress = $socket->peerhost();
   $peerport = $socket->peerport();
   print "\n($peeraddress , $peerport) said : $received";
}

$socket->close();

编辑:当“localhost”被“0.0.0.0”替换时,上面的代码有效,请参阅@ikegami 的回答。 如评论中所述,由于系统防火墙,还存在流量无法到达的问题。

您正在收听 127.0.0.1:162,但流量将流向另一个适配器。

假设您在 NAT 路由器后面并且您的 inte.net 流量转到 192.168.1.2。 您需要收听 192.168.1.2:162 而不是 127.0.0.1:162。

或者,您可以收听 0.0.0.0:162。 特殊地址 0.0.0.0 表示您想要监听所有适配器,因此在我们的示例中为 127.0.0.1 和 192.168.1.2。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM