You need to enable JavaScript to run this app. Python socket库recvfrom无法收到以太网直连设备发送的UDP报文问题
优惠活动
大模型
产品
解决方案
定价
更多

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
      如果查询结果有其他进程占用该端口,结束对应进程或修改服务端绑定端口即可。

分层定位测试方法

你可以先运行本地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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 18:45:00