我设置了一个独立的网络(不连接任何其他设备),其中有四台设备,每台设备位于略有不同的子网中。只有一个集线器,四台设备都连接到它。
- 树莓派:10.10.0.1/24
- 嵌入式旧版本:10.11.0.1/24
- 嵌入式新版本:10.12.0.1/24
- Mac:10.13.0.1/24
我们使用以下代码发送 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、Raspberry Pi 和嵌入式 PC(旧图像)均接收 UDP 广播。
嵌入式 PC(新映像)不会接收 UDP 广播。有趣的是,如果发送方位于同一子网,新映像将接收广播。
嵌入式 PC(旧图像)正在运行:
- 内核:5.3
- OE:战士
嵌入式 PC(新图像)正在运行:
- 内核:6.1
- OE:柯克斯通
这些版本之间是否有任何变化可能会阻止它接收 UDP 广播?我们需要进行网络设置吗?
更新:
255.255.255.255 广播中未收到任何内容:
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
----------> SEND BROADCAST PACKET
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
但在常规消息中却是:
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
-----> SEND PACKET 192.168.10.255
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
回到内核 5.3 (带有 Kirkstone) 也遇到了同样的问题。