https://github.com/dashersw/docker-cloud-multicast/blob/master/mcreceive.c
$ ./mcreceive X.X.X.X 60001
where X.X.X.X is a multicast address
Received 28 bytes from X.X.X.X: Ϭ(
Received 28 bytes from X.X.X.X: Ϭ(
Received 28 bytes from X.X.X.X: Ϭ(
Received 28 bytes from X.X.X.X: Ϭ(
Received 56 bytes from X.X.X.X: Ϭ(
Received 28 bytes from X.X.X.X: (
Received 28 bytes from X.X.X.X: Ϭ(
Received 56 bytes from X.X.X.X: Ϭ(
Received 168 bytes from X.X.X.X: Ϭ(
Received 28 bytes from X.X.X.X: %Ϭ(
Received 28 bytes from X.X.X.X: &Ϭ(
Received 28 bytes from X.X.X.X: 'Ϭ(
Ethernet II: 18 bytes
IP: Minimum 20 bytes (can be more with options)
UDP: 8 bytes
Related source code:
/* create socket to join multicast group on */
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
perror("socket() failed");
exit(1);
}
...
/* block waiting to receive a packet */
if ((recv_len = recvfrom(sock, recv_str, MAX_LEN, 0,
(struct sockaddr*)&from_addr, &from_len)) < 0) {
perror("recvfrom() failed");
exit(1);
}
/* output received string */
printf("Received %d bytes from %s: ", recv_len,
inet_ntoa(from_addr.sin_addr));
Question> As you can see, I have received a few packets with a length of 28. How could I receive a UDP packet with length less than 18+20+8?
You created a UDP socket, so
recvfromonly returns the UDP payload, not the UDP or lower layer headers. So the length being return is that of just the payload.A raw socket would give you access to the Ethernet, IP, and UDP headers.