3 #include <sys/socket.h>
4 #include <sys/sysctl.h>
9 #include <netinet/in.h>
18 static void mainloop(const struct sockaddr_in *, long, u_long *);
20 static int global_stopped;
23 usage(const char *cmd)
25 fprintf(stderr, "%s -4 inet4 -p port "
26 "[-i n_instance] [-l duration]\n", cmd);
31 main(int argc, char *argv[])
33 struct sockaddr_in in;
39 prm_len = sizeof(ninst);
40 if (sysctlbyname("hw.ncpu", &ninst, &prm_len, NULL, 0) != 0)
41 err(2, "sysctl hw.ncpu failed");
43 memset(&in, 0, sizeof(in));
44 in.sin_family = AF_INET;
48 while ((opt = getopt(argc, argv, "4:p:i:l:")) != -1) {
51 if (inet_pton(AF_INET, optarg, &in.sin_addr) <= 0) {
52 fprintf(stderr, "invalid inet address %s\n",
59 in.sin_port = htons(atoi(optarg));
67 dur = strtol(optarg, NULL, 10);
75 if (ninst < 1 || dur < 1 ||
76 in.sin_port == 0 || in.sin_addr.s_addr == INADDR_ANY)
79 result = mmap(NULL, ninst * sizeof(u_long), PROT_READ | PROT_WRITE,
80 MAP_ANON | MAP_SHARED, -1, 0);
81 if (result == MAP_FAILED)
82 err(1, "mmap failed");
83 memset(result, 0, ninst * sizeof(u_long));
85 for (i = 0; i < ninst; ++i) {
90 mainloop(&in, dur, &result[i]);
93 err(1, "fork failed");
97 for (i = 0; i < ninst; ++i) {
100 pid = waitpid(-1, NULL, 0);
102 err(1, "waitpid failed");
106 for (i = 0; i < ninst; ++i)
108 printf("%.2f\n", (double)sum / (double)dur);
114 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 err(1, "signal failed");
128 it.it_interval.tv_sec = 0;
129 it.it_interval.tv_usec = 0;
130 it.it_value.tv_sec = dur;
131 it.it_value.tv_usec = 0;
133 if (setitimer(ITIMER_REAL, &it, NULL) < 0)
134 err(1, "setitimer failed");
136 while (!global_stopped) {
139 s = socket(AF_INET, SOCK_STREAM, 0);
144 (const struct sockaddr *)in, sizeof(*in)) == 0)