无法在 Ubuntu 20.04 LTS 上使用 python 接收 UDP 广播,适用于同一网络上的 Raspbian 和 Centos
Can't receive UDP broadcast with python on Ubuntu 20.04 LTS, works on Raspbian & Centos on same network
我的 LAN 上有一个设备正在 UDP 50222 上发送广播数据包。使用 tcpdump,我可以看到数据包,但是在 python 我的 Ubuntu 20.04 LTS 盒子上没有收到数据。但是,在同一 LAN(Centos 7.8 和 Raspbian 9 [stretch])上的两个其他系统上,完全相同的代码可以工作。这似乎并不完全限于 python; 运行 nc -lu 50222 在两个非 Ubuntu 系统上工作,但在 Ubuntu 框上没有收到数据。
这是我用来测试的一些代码:
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(("", 50222))
while True:
data, addr = client.recvfrom(1024)
print("received message: %s"%data)
我相信实际上不需要对 setsockopt() 的两次调用,但我已经尝试过使用和不使用它们,并且在任何机器上都没有区别。
我已经尝试 运行 示例代码以及 sudo 下的 netcat,但这没有区别。查看 Wireshark 中的 tcpdump 捕获,数据包包含我期望的数据,并且校验和正确。
在这里和其他地方搜索,我看到的最常见的问题是绑定不正确,但我相信我使用的是正确的。
有什么建议吗?
事实证明,Ubuntu 框上启用了防火墙,该防火墙被锁定到仅允许特定端口上的本地流量。添加规则以允许解决问题。我仍然不太确定为什么 tcpdump 工作,大概它在较低层并且不受防火墙的影响。
我的 LAN 上有一个设备正在 UDP 50222 上发送广播数据包。使用 tcpdump,我可以看到数据包,但是在 python 我的 Ubuntu 20.04 LTS 盒子上没有收到数据。但是,在同一 LAN(Centos 7.8 和 Raspbian 9 [stretch])上的两个其他系统上,完全相同的代码可以工作。这似乎并不完全限于 python; 运行 nc -lu 50222 在两个非 Ubuntu 系统上工作,但在 Ubuntu 框上没有收到数据。
这是我用来测试的一些代码:
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(("", 50222))
while True:
data, addr = client.recvfrom(1024)
print("received message: %s"%data)
我相信实际上不需要对 setsockopt() 的两次调用,但我已经尝试过使用和不使用它们,并且在任何机器上都没有区别。
我已经尝试 运行 示例代码以及 sudo 下的 netcat,但这没有区别。查看 Wireshark 中的 tcpdump 捕获,数据包包含我期望的数据,并且校验和正确。
在这里和其他地方搜索,我看到的最常见的问题是绑定不正确,但我相信我使用的是正确的。
有什么建议吗?
事实证明,Ubuntu 框上启用了防火墙,该防火墙被锁定到仅允许特定端口上的本地流量。添加规则以允许解决问题。我仍然不太确定为什么 tcpdump 工作,大概它在较低层并且不受防火墙的影响。