我的局域网中有一台设备正在UDP 50222上发送广播数据包。使用tcpdump,我可以看到这些数据包,但是在Ubuntu 20.04 LTS盒中的python中,没有接收到数据。但是,在同一LAN上的其他2个系统(Centos 7.8和Raspbian 9 [stretch])上,完全相同的代码有效。这似乎并不完全局限于python。在两个非Ubuntu系统上运行nc -lu 50222可以运行,但是在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可以工作,大概是它在较低层并且不受防火墙限制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句