Search code examples
multicast

Any small program to receive multicast packets on specified UDP port?


I'd like to debug some multicast issues, and I hope to have some small programs/utilities to display incoming multicast packets.

From the sending machine(A), I use Richard Stevens's sock program(provided with his TCP/IP Illustrated book Vol1) to send multicast packets(source port=dest port=7000), like this:

sock -u -b 7000 224.0.0.7 7000

On the receiving machine(B), I can capture the very sent packet with Wireshark, however, the same sock command running on B does not report receiving anything.

Then, what program should I use on B to see incoming multicast packets, aside from Wireshark which is overkill.

Linux and Windows programs are both welcome.

enter image description here


Solution

  • Here's a Python script that will print the incoming data:

    # 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(False) 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(False)
    
    while 1:
        try:
            data, addr = sock.recvfrom(1024)
        except socket.error as e:
            pass
        else:
            print("From: ", addr)
            print("Data: ", data)