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 fprintf(stderr, "sysctl hw.ncpu failed: %d\n", errno);
45 memset(&in, 0, sizeof(in));
46 in.sin_family = AF_INET;
50 while ((opt = getopt(argc, argv, "4:p:i:l:")) != -1) {
53 if (inet_pton(AF_INET, optarg, &in.sin_addr) <= 0) {
54 fprintf(stderr, "invalid inet address %s\n",
61 in.sin_port = htons(atoi(optarg));
69 dur = strtol(optarg, NULL, 10);
77 if (ninst < 1 || dur < 1 ||
78 in.sin_port == 0 || in.sin_addr.s_addr == INADDR_ANY)
81 result = mmap(NULL, ninst * sizeof(u_long), PROT_READ | PROT_WRITE,
82 MAP_ANON | MAP_SHARED, -1, 0);
83 if (result == MAP_FAILED) {
84 fprintf(stderr, "mmap failed: %d\n", errno);
87 memset(result, 0, ninst * sizeof(u_long));
89 for (i = 0; i < ninst; ++i) {
94 mainloop(&in, dur, &result[i]);
97 fprintf(stderr, "fork failed: %d\n", errno);
101 for (i = 0; i < ninst; ++i) {
104 pid = waitpid(-1, NULL, 0);
106 fprintf(stderr, "waitpid failed: %d\n", errno);
112 for (i = 0; i < ninst; ++i)
114 printf("%.2f\n", (double)sum / (double)dur);
120 signal_handler(int signum __unused)
127 mainloop(const struct sockaddr_in *in, long dur, u_long *res)
132 if (signal(SIGALRM, signal_handler) == SIG_ERR) {
133 fprintf(stderr, "signal failed: %d\n", errno);
137 it.it_interval.tv_sec = 0;
138 it.it_interval.tv_usec = 0;
139 it.it_value.tv_sec = dur;
140 it.it_value.tv_usec = 0;
142 if (setitimer(ITIMER_REAL, &it, NULL) < 0) {
143 fprintf(stderr, "setitimer failed: %d\n", errno);
147 while (!global_stopped) {
150 s = socket(AF_INET, SOCK_STREAM, 0);
155 (const struct sockaddr *)in, sizeof(*in)) == 0)