Changeset 4775
- Timestamp:
- 11/09/08 20:39:20 (5 years ago)
- Location:
- developers/werner/owping
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
developers/werner/owping/README
r4764 r4775 11 11 Receiver: 12 12 13 % owping 13 % owping [-p port] 14 14 15 15 Sender: 16 16 17 % owping [-c count] ip_address17 % owping [-c count] [-p port] ipv4_address 18 18 19 19 … … 31 31 compares this with the inter-arrival time it measures. 32 32 33 - receiver should also handle SIGINT, and print statistics34 35 33 - receiver should count gaps in the sequence numbers 36 37 - should support host name resolution38 39 - should support setting the port number -
developers/werner/owping/owping.c
r4764 r4775 16 16 #include <stdio.h> 17 17 #include <unistd.h> 18 #include <string.h> 19 #include <netdb.h> 18 20 #include <arpa/inet.h> 19 21 … … 21 23 22 24 23 #define PORT 2386725 #define DEFAULT_PORT 23867 24 26 25 27 26 28 static void usage(const char *name) 27 29 { 28 fprintf(stderr, "usage: %s [ [-c count] ip_address]\n", name);30 fprintf(stderr, "usage: %s [-p port] [[-c count] ipv4_address]\n", name); 29 31 exit(1); 30 32 } … … 34 36 { 35 37 struct sockaddr_in addr; 36 int count = -1; 38 long count = -1; 39 unsigned long port = DEFAULT_PORT; 37 40 int c; 38 41 char *end; 39 42 40 while ((c = getopt(argc, argv, "c:")) != EOF) 43 addr.sin_family = AF_INET; 44 addr.sin_addr.s_addr = INADDR_ANY; 45 addr.sin_port = htons(DEFAULT_PORT); 46 47 while ((c = getopt(argc, argv, "c:p:")) != EOF) 41 48 switch (c) { 42 49 case 'c': 43 50 count = strtoul(optarg, &end, 10); 44 if (*end) 45 usage(*argv); 51 if (*end || count < 0 || count > INT_MAX) { 52 fprintf(stderr, "%s: invalid port\n", optarg); 53 exit(1); 54 } 55 break; 56 case 'p': 57 port = strtoul(optarg, &end, 10); 58 if (!*end && port && port <= 0xffff) 59 addr.sin_port = htons(port); 60 else { 61 struct servent *se; 62 63 se = getservbyname(optarg, "udp"); 64 if (!se) { 65 fprintf(stderr, "%s: unknown port\n", optarg); 66 exit(1); 67 } 68 addr.sin_port = se->s_port; 69 } 46 70 break; 47 71 default: … … 51 75 switch (argc-optind) { 52 76 case 0: 53 rx( PORT);77 rx((const struct sockaddr_in *) &addr); 54 78 break; 55 79 case 1: 56 80 addr.sin_family = AF_INET; 57 81 addr.sin_addr.s_addr = inet_addr(argv[optind]); 58 addr.sin_port = htons(PORT); 59 if (addr.sin_addr.s_addr == (in_addr_t) -1) 60 usage(*argv); 61 tx(addr, count); 82 addr.sin_port = htons(port); 83 if (addr.sin_addr.s_addr == (in_addr_t) -1) { 84 struct hostent *he; 85 86 he = gethostbyname(argv[optind]); 87 if (!he || he->h_addrtype != AF_INET) { 88 fprintf(stderr, "%s: unknown host\n", argv[optind]); 89 exit(1); 90 } 91 memcpy(&addr.sin_addr.s_addr, he->h_addr, he->h_length); 92 } 93 tx((const struct sockaddr_in *) &addr, count); 62 94 break; 63 95 default: -
developers/werner/owping/owping.h
r4763 r4775 27 27 28 28 29 void tx( struct sockaddr_inaddr, int num);30 void rx( int port);29 void tx(const struct sockaddr_in *addr, int num); 30 void rx(const struct sockaddr_in *addr); 31 31 32 32 #endif /* OWPING_H */ -
developers/werner/owping/rx.c
r4764 r4775 15 15 #include <stdlib.h> 16 16 #include <stdio.h> 17 #include <unistd.h> 17 18 #include <string.h> 18 19 #include <math.h> 20 #include <signal.h> 19 21 #include <sys/time.h> 20 22 #include <sys/socket.h> … … 29 31 double sum, sq; 30 32 int n; 31 } ;33 } stats_itf, stats_user; 32 34 33 35 … … 42 44 double avg = stats->sum/stats->n; 43 45 44 printf("%s min/avg/max/sdev = %.3f/%.3f/%.3f/%.3f ms (%d packets)\n",46 printf("%s min/avg/max/sdev = %.3f/%.3f/%.3f/%.3f ms\n", 45 47 label, 46 48 stats->min/1000.0, avg/1000.0, stats->max/1000.0, 47 sqrt(stats->sq/stats->n-avg*avg)/1000.0, 48 stats->n); 49 sqrt(stats->sq/stats->n-avg*avg)/1000.0); 49 50 } 50 51 … … 78 79 79 80 80 void rx(int port)81 static void finish(void) 81 82 { 82 struct stats stats_itf, stats_user; 83 struct sockaddr_in addr; 83 printf("received %d packets\n", stats_itf.n); 84 stats_print("itf:", &stats_itf); 85 stats_print("app:", &stats_user); 86 } 87 88 89 static void handler(int sig) 90 { 91 finish(); 92 _exit(0); 93 } 94 95 96 static void block(int how) 97 { 98 sigset_t set; 99 100 if (sigemptyset(&set) < 0) { 101 perror("sigemptyset"); 102 exit(1); 103 } 104 if (sigaddset(&set, SIGINT) < 0) { 105 perror("sigaddset"); 106 exit(1); 107 } 108 if (sigprocmask(how, &set, NULL) < 0) { 109 perror("sigprocmask"); 110 exit(1); 111 } 112 } 113 114 115 void rx(const struct sockaddr_in *addr) 116 { 117 struct sockaddr_in src; 84 118 int s; 85 119 … … 90 124 } 91 125 92 addr.sin_family = AF_INET; 93 addr.sin_addr.s_addr = INADDR_ANY; 94 addr.sin_port = htons(port); 95 if (bind(s, (const struct sockaddr *) &addr, sizeof(addr)) < 0) { 126 if (bind(s, (const struct sockaddr *) addr, sizeof(*addr)) < 0) { 96 127 perror("bind"); 97 128 exit(1); … … 101 132 stats_init(&stats_user); 102 133 134 if (atexit(finish)) { 135 perror("atexit"); 136 exit(1); 137 } 138 if (signal(SIGINT, handler) == SIG_ERR) { 139 perror("signal(SIGINT)"); 140 exit(1); 141 } 142 103 143 while (1) { 104 144 struct owping buf; … … 107 147 struct timeval t_src, t_itf, t_user; 108 148 109 addr_len = sizeof( addr);149 addr_len = sizeof(src); 110 150 got = recvfrom(s, &buf, sizeof(buf), 0, 111 (struct sockaddr *) & addr, &addr_len);151 (struct sockaddr *) &src, &addr_len); 112 152 if (got < 0) { 113 153 perror("recvmsg"); … … 129 169 exit(1); 130 170 } 171 block(SIG_BLOCK); 131 172 printf("seq=%u from %s:", (unsigned) ntohl(buf.seq), 132 inet_ntoa( addr.sin_addr));173 inet_ntoa(src.sin_addr)); 133 174 t_src.tv_sec = ntohl(buf.tv_sec); 134 175 t_src.tv_usec = ntohl(buf.tv_usec); … … 136 177 delta(t_src, t_user, &stats_user); 137 178 putchar('\n'); 179 block(SIG_UNBLOCK); 138 180 } 139 stats_print("itf:", &stats_itf);140 stats_print("app:", &stats_user);141 142 181 } -
developers/werner/owping/tx.c
r4764 r4775 40 40 41 41 42 void tx( struct sockaddr_inaddr, int num)42 void tx(const struct sockaddr_in *addr, int num) 43 43 { 44 44 ssize_t sent; … … 51 51 } 52 52 53 if (connect(s, (const struct sockaddr *) &addr, sizeof(addr)) < 0) {53 if (connect(s, (const struct sockaddr *) addr, sizeof(*addr)) < 0) { 54 54 perror("connect"); 55 55 exit(1);
Note: See TracChangeset
for help on using the changeset viewer.
