我有一个以太网设备将 UDP 数据包发送到端口 42102 上的多播地址 224.0.2.2。我能够从 wireshark 或 tcpdump 捕获数据包,但当我尝试打开套接字并将其绑定到多播端口时,我什么也没收到。我相信这与我的 Ubuntu 设置有关,因为我可以在 Windows 上使用相同的 python 脚本获取数据包,但在 Ubuntu 22.04 上却不能。
对于基本代码,我尝试了以下多种变体。我尝试以 sudo 等身份运行,但没有成功。连接接口 (enp12s0) 的 ip 地址是 10.13.1.100。
import socket
import struct
def mc_recv(fromnicip, mcgrpip, mcport):
# This creates a UDP socket
sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM, \
proto=socket.IPPROTO_UDP, fileno=None)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
bindaddr = (mcgrpip, mcport)
sock.bind(bindaddr)
mreq = struct.pack("=4s4s", socket.inet_aton(mcgrpip), socket.inet_aton(fromnicip))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
data, addr = sock.recvfrom(1024)
print(f"Received packet from {addr}: {data.decode('utf-8')}")
def main():
fromnicip = '10.13.1.100'
mcgrpip = '224.0.2.2'
mcport = 42102
mc_recv(fromnicip, mcgrpip, mcport)
if __name__=='__main__':
main()
到目前为止,我还没有在任何配置中收到任何 UDP 数据包。
作为参考,如果我使用
sudo tshark -f "host 224.0.2.2" -f "port 42102" -i enp12s0
捕获的数据包摘要如下
59 0.949480840 10.13.1.113 → 224.0.2.2 UDP 130 42402 → 42102 Len=84
60 1.000030440 10.13.1.113 → 224.0.2.2 UDP 130 42402 → 42102 Len=84
正如我上面所说,我在同一台机器上的 Windows 启动上尝试了上述代码,并且成功了。我猜这与 Linux 端的网络配置有关,但我不知道问题可能是什么。注意到防火墙问题是我尝试过的一些类似问题的解决方案
sudo ufw status
然后它又回来了
Status: inactive
还有其他东西可以解释 Windows 和 Ubuntu 上的 Python 结果之间的差异吗?