跨子网UDP广播接收异常问题求助(新旧嵌入式系统版本对比)
跨子网UDP广播接收异常问题求助(新旧嵌入式系统版本对比)
大家好,我遇到一个跨子网UDP广播接收的异常问题,想请教下各位大佬:
我搭建了一个独立的测试网络(没有连接外部其他设备),用一台集线器连接了4台设备,每台设备都配置在不同的/24子网:
- Raspberry Pi:
10.10.0.1/24 - 旧版本嵌入式PC:
10.11.0.1/24 - 新版本嵌入式PC:
10.12.0.1/24 - Mac:
10.13.0.1/24
我用以下Python代码发送UDP广播:
广播发送代码
import socket UDP_IP_ADDRESS = "255.255.255.255" UDP_PORT_NO = 5007 MESSAGE = "Hello, world!" udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) udp_socket.sendto(bytes(MESSAGE, "utf-8"), (UDP_IP_ADDRESS, UDP_PORT_NO)) udp_socket.close()
同时所有设备都运行以下监听代码接收广播:
广播接收代码
import socket client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # UDP client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) client.bind(("", 5007)) while True: data, addr = client.recvfrom(1024) print("received message: %s" % data)
问题现象
Mac、树莓派和旧版本嵌入式PC都能正常收到跨子网的255.255.255.255广播,但新版本嵌入式PC完全收不到。有意思的是,如果发送端和新PC在同一个子网,它就能正常接收广播。
设备系统版本差异
- 旧嵌入式PC:
- 内核版本:5.3
- OpenEmbedded版本:Warrior
- 新嵌入式PC:
- 内核版本:6.1
- OpenEmbedded版本:Kirkstone
我想请教的是:这两个版本的系统之间,有没有什么默认配置或者内核行为的变化会导致跨子网UDP广播接收失败?是不是需要调整networkd的某个配置项?
更新1:网络统计数据验证
为了确认问题,我用netstat -i查看了新PC的网络接收情况:
- 发送
255.255.255.255广播后,RX-OK计数没有变化(依然是64),说明数据包根本没到应用层:
root@VIA-511723:~# netstat -i Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 64 0 0 0 25 0 0 0 BMRU lo 65536 0 0 0 0 0 0 0 0 LRU
- 发送同子网的广播
192.168.10.255后,RX-OK计数增加到65,说明数据包正常被接收:
root@VIA-511723:~# netstat -i Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 65 0 0 0 25 0 0 0 BMRU lo 65536 0 0 0 0 0 0 0 0 LRU
更新2:内核版本回测结果
我尝试把新PC的内核换回5.3(搭配Kirkstone版本的OE),结果问题依然存在。这说明问题可能不是内核版本导致的,而是OpenEmbedded从Warrior升级到Kirkstone带来的默认配置变化?
备注:内容来源于stack exchange,提问作者iphaaw
相关产品推荐
相关产品推荐

