Home | History | Annotate | Download | only in mc_commo
      1 #include <sys/types.h>
      2 #include <sys/socket.h>
      3 #include <netinet/in.h>
      4 #include <errno.h>
      5 #include <unistd.h>
      6 #include <stdio.h>
      7 #include <stdlib.h>
      8 #include <string.h>
      9 #include <fcntl.h>
     10 #include <netdb.h>
     11 
     12 #define	MAXBUFSIZ	8096
     13 
     14 static char buf[MAXBUFSIZ];
     15 
     16 int main(int argc, char *argv[])
     17 {
     18 	struct ip_mreq imr;
     19 	struct sockaddr_in from_in, mcast_in;
     20 	int s = 0, n = 0, one = 1;
     21 	/*DHH 052697 Added for 64BIT Compatibility */
     22 /*	6/2/97	Mario Gallegos changed from ifdef to ifndef (PORTING)	*/
     23 #ifndef __64BIT__
     24 	unsigned int len = 0;
     25 #else
     26 	unsigned long len = 0;
     27 #endif
     28 	unsigned i1, i2, i3, i4, g1, g2, g3, g4;
     29 	struct hostent *hp, *gethostbyname();
     30 
     31 	/*int loop=0; */
     32 
     33 	if (argc < 4) {
     34 		fprintf(stderr,
     35 			"usage: %s g.g.g.g interface_name (or i.i.i.i) port\n",
     36 			argv[0]);
     37 		exit(1);
     38 	}
     39 
     40 	/* set up multicast membership structure */
     41 	if ((n = sscanf(argv[1], "%u.%u.%u.%u", &g1, &g2, &g3, &g4)) != 4) {
     42 		fprintf(stderr, "bad group address\n");
     43 		exit(1);
     44 	}
     45 	imr.imr_multiaddr.s_addr =
     46 	    htonl((g1 << 24) | (g2 << 16) | (g3 << 8) | g4);
     47 
     48 	if ((hp = gethostbyname(argv[2])))
     49 		memcpy(&imr.imr_interface.s_addr, hp->h_addr, hp->h_length);
     50 	else if ((n = sscanf(argv[2], "%u.%u.%u.%u", &i1, &i2, &i3, &i4)) != 4) {
     51 		fprintf(stderr, "Bad group interface address\n");
     52 		exit(1);
     53 	} else
     54 		imr.imr_interface.s_addr =
     55 		    htonl((i1 << 24) | (i2 << 16) | (i3 << 8) | i4);
     56 
     57 	/* set up socket structure */
     58 	if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
     59 		perror("can not open socket");
     60 		exit(1);
     61 	}
     62 
     63 	memset(&mcast_in, 0x00, sizeof(mcast_in));
     64 	mcast_in.sin_family = AF_INET;
     65 	mcast_in.sin_port = htons(atoi(argv[3]));
     66 
     67 	/* allow address reuse for binding multiple multicast applications to
     68 	   the same group */
     69 	if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0) {
     70 		perror("setsockopt SO_REUSEADDR failed");
     71 		exit(1);
     72 	}
     73 
     74 	if (bind(s, (struct sockaddr *)&mcast_in, sizeof(mcast_in)) < 0) {
     75 		perror("bind");
     76 		exit(1);
     77 	}
     78 
     79 	/* Add interface to multicast group */
     80 	if (setsockopt
     81 	    (s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr,
     82 	     sizeof(struct ip_mreq)) < 0) {
     83 		perror("can not join group");
     84 		exit(1);
     85 	}
     86 	printf("Joined group\n");
     87 
     88 	/* Receive datagrams */
     89 	len = sizeof(from_in);
     90 	for (;;) {
     91 		memset(&from_in, 0x00, sizeof(from_in));
     92 		if ((n =
     93 		     recvfrom(s, buf, sizeof(buf), 0,
     94 			      (struct sockaddr *)&from_in, &len)) < 0) {
     95 			perror("recvfrom");
     96 			exit(1);
     97 		}
     98 		if (strcmp(buf, "quit") == 0)
     99 			break;
    100 		printf("%s\n", buf);
    101 	}
    102 	close(s);
    103 	exit(0);
    104 }
    105