BSD Sockets Interface Programmer's Guide

118 Chapter 5
Advanced Topics for Internet Datagram Sockets
Sending and Receiving IP Multicast Datagrams
#include <netinet/in.h>
unsigned char ttl = 64;
setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
Note that ttl is an unsigned char. Any of the values 0 through 255 can
be specified. If ttl is zero, the multicast is limited to the local system. If
ttl is one, the multicast is limited to a local network. If ttl is two, the
multicast can forwarded through at most one gateway; and so forth.
Disabling Loopback IP_MULTICAST_LOOP
Normally, if a multicast datagram is sent to a port from which an
application on the local system is reading, a copy of the datagram is
looped back and delivered to the application.
The IP_MULTICAST_LOOP socket option allows the sending application
to disable loopback for datagrams sent through that socket. For example:
#include <netinet/in.h>
unsigned char loop = 0;
setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop));
Note that loop is an unsigned char. Usually, applications should not
disable loopback. Disabling loopback provides only a modest
improvement in system performance.
Receiving IP Multicast Datagrams
IP multicasting is supported only for AF_INET sockets of type
SOCK_DGRAM and only on networks for which the interface supports
multicasting.
In order to receive multicast datagrams, an application must bind to the
port number to which multicast datagrams will be sent. If an application
binds to the address INADDR_ANY, it may receive all datagrams that
are sent to the port number. If the application binds to a multicast group
address, it may receive only datagrams sent to that group and port
number.
Additionally, the system must join the multicast group on the interface
on which the multicast datagrams arrive. An application can request
that the system join a group by using the IP_ADD_MEMBERSHIP
socket option.
An application can join up to IP_MAX_MEMBERSHIPS multicast
groups on each socket. Currently, this is defined to be 20 in
<netinet/in.h>. However, each network interface may impose a
smaller system-wide limit because of interface resource limitations and