3 #include <sys/socket.h>
8 #include <netinet/in.h>
17 static void mainloop(const struct sockaddr_in *, long, u_long *);
19 static int global_stopped;
22 usage(const char *cmd)
24 fprintf(stderr, "%s -4 inet4 -p port "
25 "[-i n_instance] [-l duration]\n", cmd);
30 main(int argc, char *argv[])
32 struct sockaddr_in in;
37 memset(&in, 0, sizeof(in));
38 in.sin_family = AF_INET;
43 while ((opt = getopt(argc, argv, "4:p:i:l:")) != -1) {
46 if (inet_pton(AF_INET, optarg, &in.sin_addr) <= 0) {
47 fprintf(stderr, "invalid inet address %s\n",
54 in.sin_port = htons(atoi(optarg));
62 dur = strtol(optarg, NULL, 10);
70 if (ninst < 1 || dur < 1 ||
71 in.sin_port == 0 || in.sin_addr.s_addr == INADDR_ANY)
74 result = mmap(NULL, ninst * sizeof(u_long), PROT_READ | PROT_WRITE,
75 MAP_ANON | MAP_SHARED, -1, 0);
76 if (result == MAP_FAILED) {
77 fprintf(stderr, "mmap failed: %d\n", errno);
80 memset(result, 0, ninst * sizeof(u_long));
82 for (i = 0; i < ninst; ++i) {
87 mainloop(&in, dur, &result[i]);
90 fprintf(stderr, "fork failed: %d\n", errno);
94 for (i = 0; i < ninst; ++i) {
97 pid = waitpid(-1, NULL, 0);
99 fprintf(stderr, "waitpid failed: %d\n", errno);
105 for (i = 0; i < ninst; ++i)
107 printf("%.2f\n", (double)sum / (double)dur);
113 signal_handler(int signum __unused)
120 mainloop(const struct sockaddr_in *in, long dur, u_long *res)
125 if (signal(SIGALRM, signal_handler) == SIG_ERR) {
126 fprintf(stderr, "signal failed: %d\n", errno);
130 it.it_interval.tv_sec = 0;
131 it.it_interval.tv_usec = 0;
132 it.it_value.tv_sec = dur;
133 it.it_value.tv_usec = 0;
135 if (setitimer(ITIMER_REAL, &it, NULL) < 0) {
136 fprintf(stderr, "setitimer failed: %d\n", errno);
140 while (!global_stopped) {
143 s = socket(AF_INET, SOCK_STREAM, 0);
148 (const struct sockaddr *)in, sizeof(*in)) == 0)