Following is an example of a socket application using IP multicasting.
struct sockaddr_in *to = (struct sockaddr_in *)&group; /* group address */
struct sockaddr_in listen_addr;
struct ip_mreq imr; /* multicast request structure */
struct in_addr ifaddr; /* multicast outgoing interface */
short loop = 0; /* don't loop back */
short ttl = 16; /* multicast time-to-live */
sock_init();
/* init */
imr.imr_multiaddr.s_addr = 0xe0010101; /* 224.1.1.1 */
imr.imr_multiaddr.s_addr = htonl(imr.imr_multiaddr.s_addr);
imr.imr_interface.s_addr = INADDR_ANY;
imr.imr_interface.s_addr = htonl(imr.imr_interface.s_addr);
ifaddr.s_addr = INADDR_ANY;
ifaddr.s_addr = htonl(ifaddr.s_addr);
bzero( (char *)&group, sizeof(struct sockaddr_in) );
to->sin_len = sizeof(to);
to->sin_family = AF_INET;
to->sin_port = 1201; /* some port number */
to->sin_port = htons(to->sin_port);
to->sin_addr.s_addr = imr.imr_multiaddr.s_addr;
listen_addr = (*to);
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock <= 0) {
psock_errno("Bad socket");
exit(1);
}
/* join group */
if( setsockopt( sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
&imr, sizeof(struct ip_mreq) ) == -1 ) {
psock_errno( "can't join group" );
exit(1);
}
/* set multicast options */
if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,
&ifaddr, sizeof(ifaddr)) == -1) {
perror ("can't set multicast source interface");
exit(1);
}
if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, 1) == -1)) {
psock_errno ("can't disable multicast loopback");
exit(1);
}
if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, 1) == -1)) {
psock_errno ("can't set multicast ttl");
exit(1);
}
/* bind to a group address */
if (bind(sock, &listen_addr, sizeof(struct sockaddr_in)) != 0) {
psock_errno("Binding multicast socket");
exit(1);
}
.
.
.
/* leave group */
if( setsockopt( sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
&imr, sizeof(struct ip_mreq) ) == -1 ) {
psock_errno( "can't leave group" );
exit(1);
}
.
.
.