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 <time.h> 11 #include <netdb.h> 12 13 #define MAXBUFSIZ 8096 14 15 static char buf[MAXBUFSIZ]; 16 static int Num_Loops = 100; 17 18 int main(int argc, char *argv[]) 19 { 20 struct ip_mreq imr; 21 struct sockaddr_in sin, mcast_out; 22 int i = 0, s = 0, n = 0; 23 unsigned i1, i2, i3, i4, g1, g2, g3, g4; 24 struct hostent *hp, *gethostbyname(); 25 char myname[64]; 26 char ttl = 0; 27 28 if (argc < 4) { 29 fprintf(stderr, 30 "usage: %s g.g.g.g interface_name (or i.i.i.i) port [ttl]\n", 31 argv[0]); 32 exit(1); 33 } 34 35 /* Get local host name */ 36 if (gethostname(myname, sizeof(myname) - 1) < 0) { 37 perror("gethostname"); 38 exit(1); 39 } 40 41 /* set up multicast membership structure */ 42 if ((n = sscanf(argv[1], "%u.%u.%u.%u", &g1, &g2, &g3, &g4)) != 4) { 43 fprintf(stderr, "bad group address\n"); 44 exit(1); 45 } 46 imr.imr_multiaddr.s_addr = 47 htonl((g1 << 24) | (g2 << 16) | (g3 << 8) | g4); 48 49 if ((hp = gethostbyname(argv[2]))) { 50 memcpy(&imr.imr_interface.s_addr, hp->h_addr, hp->h_length); 51 } else 52 if ((n = sscanf(argv[2], "%u.%u.%u.%u", &i1, &i2, &i3, &i4)) != 4) { 53 fprintf(stderr, "Bad interface address\n"); 54 exit(1); 55 } else 56 imr.imr_interface.s_addr = 57 htonl((i1 << 24) | (i2 << 16) | (i3 << 8) | i4); 58 59 /* Set up socket structure for sendto */ 60 memset(&mcast_out, 0x00, sizeof(mcast_out)); 61 memset(&sin, 0x00, sizeof(sin)); 62 mcast_out.sin_family = sin.sin_family = AF_INET; 63 mcast_out.sin_port = sin.sin_port = htons(atoi(argv[3])); 64 65 mcast_out.sin_addr.s_addr = imr.imr_multiaddr.s_addr; 66 67 /* Create socket */ 68 if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { 69 perror("can not open socket"); 70 exit(1); 71 } 72 73 /* Set socket for multicasting */ 74 if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, 75 &imr.imr_interface.s_addr, 76 sizeof(imr.imr_interface.s_addr)) != 0) { 77 fprintf(stderr, 78 "Error: unable to set socket option IP_MULTICAST_IF\n"); 79 exit(1); 80 } 81 82 /* With an even port number the loopback will be disabled */ 83 /* loop = atoi(argv[3])&1; 84 if (setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(char))!= 0) { 85 fprintf (stderr, 86 "Error: unable to set socket option IP_MULTICAST_LOOP\n"); 87 exit (1); 88 } 89 */ 90 ttl = atoi(argv[4]); 91 if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0) { 92 perror("can not set ttl"); 93 exit(1); 94 } 95 96 /* Send datagrams */ 97 for (i = 1; i < Num_Loops; i++) { 98 sprintf(buf, "%s %d %d", argv[2], i, (int)time(0)); 99 if ((n = 100 sendto(s, buf, sizeof(buf), 0, 101 (struct sockaddr *)&mcast_out, 102 sizeof(mcast_out))) < 0) { 103 perror("setsockopt"); 104 exit(1); 105 } 106 sleep(1); 107 } 108 109 /* Tell recevier to close */ 110 sprintf(buf, "quit"); 111 if ((n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *)&mcast_out, 112 sizeof(mcast_out))) < 0) { 113 perror("setsockopt"); 114 exit(1); 115 } 116 117 close(s); 118 exit(0); 119 } 120