You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Perl的IO::Socket捕获UDP流量?代码无法进入循环求解

解决思路与修正方案

核心问题1:监听地址限制

你的Perl脚本仅监听本地回环接口(localhost即127.0.0.1)的流量,而tcpdump捕获到的162端口UDP流量大概率来自其他网络接口,因此脚本无法接收到这些流量。

修正方法:将LocalAddr参数改为0.0.0.0,让socket监听所有可用网络接口的传入流量,修正后的代码如下:

use IO::Socket::INET;

# flush after every write
$| = 1;

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

my $socket = new IO::Socket::INET(
   LocalAddr => '0.0.0.0',  # 修改此处
   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();

额外排查点:系统防火墙

即使修正了监听地址,仍需确认系统防火墙是否拦截了162端口的UDP入站流量。可以通过以下方式排查:

  • 临时关闭防火墙测试脚本是否能正常接收流量;
  • 为防火墙添加允许规则,例如使用iptables的命令:
    iptables -A INPUT -p udp --dport 162 -j ACCEPT
    
    (具体命令需根据你使用的防火墙工具调整,如ufw、firewalld等)

内容的提问来源于stack exchange,提问作者Marcus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:10:27