A Socket Program Example

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);
       }
       .
       .
       .


[Back: Multicasting and the setsockopt() Call]
[Next: Socket Secure Support]