Python socket库recvfrom无法收到以太网直连设备发送的UDP报文问题
UDP服务端阻塞在recvfrom无法接收报文排查方案
优先级排查项
防火墙/安全软件拦截
这是Wireshark能抓包但用户态程序收不到的最高概率原因:报文到达网卡后会被操作系统防火墙规则过滤,符合丢弃规则的报文不会被转发到对应套接字。
可先临时关闭直连网卡对应的防火墙测试,确认是防火墙问题后添加对应放行规则:- Windows:在高级安全Windows Defender防火墙中添加入站规则,放行UDP协议12345端口
- Linux:执行命令
ufw allow 12345/udp(ufw管理防火墙)或对应iptables规则
绑定IP与接收网卡不匹配
确认你绑定的192.168.1.123确实是和微控制器直连的物理以太网网卡的IP,不是WiFi、虚拟网卡等其他接口的IP。
可临时将绑定地址改为0.0.0.0(监听所有网卡)测试:UDPServerSocket.bind(("0.0.0.0", localPort)),如果改后能正常接收,说明原绑定IP配置错误,需要重新确认直连网卡的静态IP设置,排查是否存在IP冲突。UDP报文校验和错误
Wireshark默认会忽略网卡校验和卸载导致的校验和异常显示,可手动检查抓包中微控制器发送报文的UDP校验和是否合法。如果微控制器端网络栈计算的校验和错误,操作系统内核会直接丢弃这类非法报文,不会转发到用户态程序,需要排查微控制器端UDP校验和的计算逻辑。端口占用/权限问题
先确认12345端口没有被其他程序占用:- Windows执行命令:
netstat -ano | findstr 12345 - Linux执行命令:
ss -ulnp | grep 12345
如果查询结果有其他进程占用该端口,结束对应进程或修改服务端绑定端口即可。
- Windows执行命令:
分层定位测试方法
你可以先运行本地UDP测试脚本,排除电脑本身配置问题:
# 本地测试用UDP客户端 import socket target_ip = "192.168.1.123" target_port = 12345 client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) client_socket.sendto(b"local_test_packet", (target_ip, target_port)) print("测试报文已发送")
如果本地测试脚本发送的报文能被服务端正常接收,说明问题出在微控制器端的报文构造或者链路配置,反之则继续排查电脑端的系统配置。
内容的提问来源于stack exchange,提问作者Caspar Westerberg
相关产品推荐
相关产品推荐

