Receiving IPv6 Multicast Datagrams
Before a host can receive IP multicast datagrams, the host must become a member of one, or more IP multicast groups. A process can ask the host to join a multicast group by using the following socket option:
struct ipv6_mreq mreq; setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq))
where mreq
is the structure:
struct ipv6_mreq { struct in6_addr ipv6mr_multiaddr; /* IPv6 multicast addr */ unsigned int ipv6mr_interface; /* interface index */ }
Each membership is associated with a single interface. You can join
the same group on more than one interface. Specify ipv6_interface
to
be 0
to choose the default multicast interface. Specify
an interface index for one of the host's interfaces to choose that multicast-capable
interface.
To leave a group, use:
struct ipv6_mreq mreq; setsockopt(sock, IPPROTO_IPV6, IP_LEAVE_GROUP, &mreq, sizeof(mreq))
where mreq
contains the same values used to add the
membership. The socket drops associated memberships when the socket is closed,
or when the process that holds the socket is killed. More than one socket
can claim a membership in a particular group. The host remains a member of
that group until the last claim is dropped.
The kernel IP layer accepts incoming multicast packets if any socket
has claimed a membership in the destination group of the datagram. Delivery
of a multicast datagram to a particular socket is determined by the destination
port and the memberships associated with the socket, or by the protocol type
for raw sockets. To receive multicast datagrams sent to a particular port,
bind to the local port, leaving the local address unspecified, such as INADDR_ANY
.
More than one process can bind to the same SOCK_DGRAM
UDP port if the
bind
()
is preceded by:
int one = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))
In this case, all sockets that are bound to the port receive every incoming
multicast UDP datagram destined to the shared port. For backward compatibility
reasons, this delivery does not apply to incoming unicast
datagrams. Unicast datagrams are never delivered to more than one socket,
regardless of how many sockets are bound to the datagram's destination port.
SOCK_RAW
sockets do not require the SO_REUSEADDR
option
to share a single IP protocol type.
The definitions required for the new, multicast-related socket options
are found in <netinet/in.h>
. All IP addresses are passed
in network byte-order.