You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python无法接收FPGA通过LAN发送的UDP广播数据包问题求助

解决FPGA UDP广播数据包Python接收不到的问题

这种情况我碰到过好多次,Wireshark能抓到包但Python收不到,核心原因基本都是监听配置有误或者防火墙拦截,咱们一步步来排查:

先修正你的Python接收代码

最常见的坑就是监听地址写错了!如果你的代码绑定的是127.0.0.1,那只能收到本地程序发的包,FPGA从局域网发的广播包根本到不了这个回环地址。

正确的接收代码示例

我帮你调整了代码,加上了必要的套接字选项:

import socket

# 创建UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 关键选项:允许重用地址/端口,避免端口被占用
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
# 确保套接字能处理广播数据包(部分系统需要这个配置)
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

# 绑定到所有网卡的5001端口——这是核心!不要绑127.0.0.1
udp_socket.bind(('0.0.0.0', 5001))

print("已启动UDP广播监听,等待数据包...")

while True:
    data, sender_addr = udp_socket.recvfrom(1024)
    print(f"来自 {sender_addr} 的数据: {data}")

逐一排查可能的原因

1. 监听地址是否正确

  • 必须绑定0.0.0.0(监听所有网卡),或者你PC有线网卡的具体IP(比如192.168.1.105),绝对不能绑定127.0.0.1
  • 如果PC有多个网卡(无线+有线),绑定0.0.0.0能确保不管哪个网卡收到包,程序都能捕获到。

2. 防火墙是不是拦截了数据包

Wireshark是在网卡底层抓包,绕过了防火墙,但Python程序的网络请求会被防火墙过滤,这是超级常见的原因:

  • 暂时关闭Windows Defender防火墙(或第三方安全软件)测试,如果能收到包了,就给Python程序添加一个入站规则,允许UDP 5001端口的流量。
  • Linux环境下,可以用ufw allow 5001/udp或者iptables添加对应规则。

3. 核对Wireshark的数据包细节

仔细查看Wireshark的捕获结果:

  • 目的端口是不是5001?别是FPGA代码里写错了端口!
  • 目的IP是不是你PC所在子网的广播地址(比如192.168.1.255)?如果FPGA发的是其他网段的广播,你的PC也收不到。
  • 源IP是不是FPGA的IP?确认数据包确实是从FPGA发过来的。

4. 套接字选项是否齐全

SO_REUSEADDRSO_REUSEPORT能避免端口被其他程序占用的问题,SO_BROADCAST确保套接字可以处理广播类型的数据包,这几个选项加上基本能覆盖大部分系统的兼容性问题。

测试步骤

  1. 先运行上面的修正代码,看能不能收到FPGA的包。
  2. 如果还是不行,关闭防火墙再试一次。
  3. 核对Wireshark里的端口和IP是否和代码配置匹配。
  4. 确认PC的有线网卡正常工作,IP地址和FPGA在同一个子网。

按这个流程走,90%的情况都能解决问题!

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

火山引擎 最新活动