如何在 Ubuntu 22.04 上使用 Python 从多播地址接收 UDP 流量?

如何在 Ubuntu 22.04 上使用 Python 从多播地址接收 UDP 流量?

我有一个以太网设备将 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 结果之间的差异吗?

相关内容