Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

multicast

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

like image 672
Jimm Chen Avatar asked Mar 04 '13 08:03

Jimm Chen


2 Answers

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(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
like image 102
robhem Avatar answered Sep 27 '22 23:09

robhem


You can use netcat (nc) to do that:

netcat -vv -l -p 1234 -u

This means netcat is verbosely listening on port 1234 of the localhost in UDP mode.

like image 32
FuePi Avatar answered Sep 27 '22 22:09

FuePi