如何用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的命令:
(具体命令需根据你使用的防火墙工具调整,如ufw、firewalld等)iptables -A INPUT -p udp --dport 162 -j ACCEPT
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

