【问题标题】:Any small program to receive multicast packets on specified UDP port?有什么小程序可以在指定的UDP端口上接收多播数据包吗?
【发布时间】:2013-03-04 08:42:03
【问题描述】:

我想调试一些多播问题,我希望有一些小程序/实用程序来显示传入的多播数据包。

从发送机(A),我使用Richard Stevens的sock程序(随他的TCP/IP插图书Vol1提供)发送多播数据包(源端口=目标端口=7000),如下所示:

sock -u -b 7000 224.0.0.7 7000

在接收机器(B)上,我可以使用 Wireshark 捕获发送的数据包,但是,在 B 上运行的相同 sock 命令没有报告接收到任何内容。

然后,我应该在 B 上使用什么程序来查看传入的多播数据包,除了 Wireshark 是矫枉过正的。

Linux 和 Windows 程序都受到欢迎。

【问题讨论】:

    标签: multicast


    【解决方案1】:

    这是一个打印传入数据的 python 脚本;

    # Multicast client
    # Adapted from: http://chaos.weblogs.us/archives/164
    
    import socket
    
    ANY = "0.0.0.0" 
    MCAST_ADDR = "224.0.0.7"
    MCAST_PORT = 7000
    
    # Create a UDP socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    
    # Allow multiple sockets to use the same PORT number
    sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    
    # Bind to the port that we know will receive multicast data
    sock.bind((ANY,MCAST_PORT))
    
    # Tell the kernel that we want to add ourselves to a multicast group
    # The address for the multicast group is the third param
    status = sock.setsockopt(socket.IPPROTO_IP,
    socket.IP_ADD_MEMBERSHIP,
    socket.inet_aton(MCAST_ADDR) + socket.inet_aton(ANY))
    
    # setblocking(0) is equiv to settimeout(0.0) which means we poll the socket.
    # But this will raise an error if recv() or send() can't immediately find or send data. 
    sock.setblocking(0)
    
    while 1:
        try:
            data, addr = sock.recvfrom(1024)
        except socket.error as e:
            pass
        else:
            print "From: ", addr
            print "Data: ", data
    

    【讨论】:

    • 我碰巧知道 Python。你 sn-p 在 Windows XP 和 Linux(openSUSE 11.3) 上工作得很好,除了它消耗 100% 的 CPU 内核。
    • 100% CPU 使用率是由于 sock.setblocking(0) 造成的,您可能希望使用 sock.settimeout(0.1) 或类似的方法来做一个小的超时阻塞读取
    • 我意识到这是一个非常古老的答案,但值得的是,这在 Python 3 中不起作用。
    【解决方案2】:

    您可以使用 netcat (nc) 来做到这一点:

    netcat -vv -l -p 1234 -u
    

    这意味着 netcat 正在以 UDP 模式详细侦听 localhost 的端口 1234。

    【讨论】:

    • 一开始不需要加入组播组才能发送数据包吗?
    【解决方案3】:

    我以前写过一个多播测试应用程序。

    您可以在这里查看:https://github.com/eranbetzalel/SimpleMulticastAnalyzer

    【讨论】:

      【解决方案4】:

      在 Windows 上,我发现这些实用程序对于调试 udp(在两端)非常方便

      http://www-personal.umich.edu/~bdr/et/mcast-windows.html#download

      【讨论】:

      • 这是一个死链接 - 是否有更新的位置?
      • 作者的页面在这里,他列出了一个电子邮件地址(所以我想可以联系到他),但他与上述工具的链接是同一个死链接。 www-personal.umich.edu/~bdr
      【解决方案5】:

      这是我使用 netcat 搜索捕获多播数据包时的第一次命中,我发现 tcpdump 做得更好。只是为其他点击此帖子的人做个笔记。

      安装:

      sudo apt install tcpdump
      

      运行:

      tcpdump -c 8 -n -i eth0 portrange 1234-1239
      

      看起来可能还有 Windows 端口,但我没有尝试:https://www.winpcap.org/windump/

      【讨论】:

      • 这是如何工作的,因为它无法知道要订阅哪个多播组?
      • @Chris 这是一个网络流量转储。只要操作系统内核接收到多播数据包并且它自己不向网络宣布成员资格,它就可以工作。
      • @Pavel:但是如果没有操作系统向网络发布任何通知,多播数据包将不会从交换机发送到 NIC(肯定)。这就是多播的全部意义 - 数据包转到订阅的“消费者”。
      • @Chris 首先,并非所有多播都是基于订阅的。二、您可以将tcpdump与其他工具一起使用,参见:unix.stackexchange.com/a/467676/60296
      猜你喜欢
      • 2012-12-29
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 2021-10-24
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多