#include #include #include #include #include #include #include #include #include #include #include #include #include int stop = 0; static void #ifdef LINUX msend_onint(int s) #else msend_onint(int s __unused) #endif { stop = 1; } static void init_signals(void) { struct sigaction sa; sa.sa_handler = msend_onint; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); if (sigaction(SIGINT, &sa, NULL)) err(1, "sigaction(%d)", SIGINT); } int main(int argc, char **argv) { char data[128]; int sock; suseconds_t usecs; unsigned long port; unsigned long long count; struct in_addr group, if_addr; struct sockaddr_in to[100]; int i, ttl, loop = 0; struct timeval starttime, endtime; double secs, rate; init_signals(); if (argc != 5){ printf ("msend ttl\n"); return 0; } memset (&to, 0, sizeof(struct sockaddr_in)); ttl = strtol(argv[4], 0, 0); if (errno != 0) err(1, "Invalid TTL - %s", argv[4]); if (inet_aton(argv[1], &group) == 0 || \ (ntohl(group.s_addr) & 0xe0000000) != 0xe0000000) err(1, "Invalid Group addres - %s", argv[1]); if (inet_aton(argv[2], &if_addr) == 0) err(1, "Invalid interface addres - %s", argv[2]); if ((port = strtoul(argv[3], NULL, 10)) == 0 || port > 0xFFFF) err(1, "Invalid port - %s", argv[3]); for (i = 0; i < 100; i++) { to[i].sin_port = htons((uint16_t)port); to[i].sin_family = AF_INET ; to[i].sin_addr.s_addr = htonl(ntohl(group.s_addr) + i); } if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))== -1) err (1, "socket failed - %s", strerror(errno)); if ( setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) == -1) err (1, "setsockopt failed - %s", strerror(errno)); if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) == -1) err (1, "setsockopt failed - %s", strerror(errno)); if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &if_addr, sizeof(if_addr)) == -1) err (1, "setsockopt failed - %s", strerror(errno)); memset(data, 0, sizeof(data)); strlcpy(data + sizeof(count), "Got Multicast?!?\n", sizeof(data) - sizeof(count)); gettimeofday(&starttime, NULL); for (count = 0; ; count++) { //memcpy(data, &count, sizeof(count)); for (i = 0; i < 100; i++) { if (sendto(sock, data, sizeof(data), 0, (struct sockaddr *) &(to[i]), sizeof(struct sockaddr_in)) < 0) err (1, "sendto failed - %s", strerror(errno)); /* fprintf(stderr, "send - %d bytes to group %s port %d" " ttl %d interface %s\n", sizeof (data), inet_ntoa(group), ntohs(to.sin_port), ttl, argv[2]); */ } if (stop) break; } gettimeofday(&endtime, NULL); close(sock); fprintf(stderr, "\n\nStart time - %lu.%lu\n", (unsigned long) starttime.tv_sec, (unsigned long) starttime.tv_usec); fprintf(stderr, "End time - %lu.%lu\n", (unsigned long) endtime.tv_sec, (unsigned long)endtime.tv_usec); if (endtime.tv_usec < starttime.tv_usec) { endtime.tv_sec -= 1; usecs = endtime.tv_usec + (1000000 - starttime.tv_usec); } else usecs = endtime.tv_usec - starttime.tv_usec; secs = (double)(endtime.tv_sec - starttime.tv_sec) + ((double)usecs)/ 1000000.; rate = ((double)count) / secs; fprintf(stderr, "%llu packets sent for %lu.%lusec - average rate %fpps\n", count, (unsigned long)endtime.tv_sec - starttime.tv_sec, (unsigned long) usecs, rate); exit(0); }