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