|
|
1.1 root 1: #include <sys/types.h>
2: #include <sys/socket.h>
3: #include <sys/time.h>
4: #include <sys/resource.h>
5: #include <netinet/in.h>
6:
7: #include <stdio.h>
8: #include <signal.h>
9: #include <setjmp.h>
10: #include <errno.h>
11:
12: struct sockaddr_in sin;
13: jmp_buf j;
14: int catchsig();
15:
16: main(argc, argv)
17: char *argv[];
18: {
19: int s, n;
20: char buf[2 * BUFSIZ];
21: struct rusage r1, r2;
22:
23: if (argc < 2) {
24: printf("usage: %s port\n", argv[0]);
25: exit(1);
26: }
27: s = socket(AF_INET, SOCK_DGRAM, 0);
28: if (s < 0) {
29: perror("inetdgs: socket");
30: exit(1);
31: }
32: sin.sin_family = AF_INET;
33: sin.sin_port = htons(atoi(argv[1]));
34: if (bind(s, &sin, sizeof (sin)) < 0) {
35: perror("inetdgs: bind");
36: exit(1);
37: }
38: for (;;) {
39: int count, ms, kb, fromlen;
40: struct timeval t1, t2;
41: struct sockaddr_in from;
42: extern int errno;
43:
44: for (;;) {
45: fromlen = sizeof (from);
46: n = recvfrom(s, buf, sizeof (buf), 0, &from, &fromlen);
47: if (n < 0) {
48: if (errno != EINTR)
49: perror("inetdgs: recvfrom");
50: continue;
51: }
52: if (strncmp(buf, "begin", 5) == 0)
53: break;
54: }
55: count = kb = 0;
56: getrusage(RUSAGE_SELF, &r1);
57: gettimeofday(&t1, (struct timezone *)0);
58: for (;;) {
59: fromlen = sizeof (from);
60: n = recvfrom(s, buf, sizeof (buf), 0, &from, &fromlen);
61: if (n < 0) {
62: if (errno != EINTR)
63: perror("inetdgs: recvfrom");
64: continue;
65: }
66: count++, kb += n;
67: if (strncmp(buf, "end", 3) == 0)
68: break;
69: }
70: gettimeofday(&t2, (struct timezone *)0);
71: getrusage(RUSAGE_SELF, &r2);
72: sleep(2);
73: timevalsub(&t2, &t1);
74: ms = t2.tv_usec / 1000;
75: printf("%d msgs (%d bytes) in %d.%d secs", count,
76: kb, t2.tv_sec, ms / 100);
77: printf(", %d bytes/msg, %6.2f kb/s, %4.1f ms/msg\n",
78: kb / count, (8. * kb) / (t2.tv_sec * 1024.),
79: (1000. * t2.tv_sec + ms) / count);
80: timevalsub(&r2.ru_stime, &r1.ru_stime);
81: timevalsub(&r2.ru_utime, &r1.ru_utime);
82: r2.ru_nvcsw -= r1.ru_nvcsw;
83: r2.ru_nivcsw -= r1.ru_nivcsw;
84: printf("System %d.%d, user %d.%d, %d vcsw, %d ivcsw\n",
85: r2.ru_stime.tv_sec, r2.ru_stime.tv_usec / 100000,
86: r2.ru_utime.tv_sec, r2.ru_utime.tv_usec / 100000,
87: r2.ru_nvcsw, r2.ru_nivcsw);
88: }
89: }
90:
91: /*
92: * Add and subtract routines for timevals.
93: * N.B.: subtract routine doesn't deal with
94: * results which are before the beginning,
95: * it just gets very confused in this case.
96: * Caveat emptor.
97: */
98: timevaladd(t1, t2)
99: struct timeval *t1, *t2;
100: {
101:
102: t1->tv_sec += t2->tv_sec;
103: t1->tv_usec += t2->tv_usec;
104: timevalfix(t1);
105: }
106:
107: timevalsub(t1, t2)
108: struct timeval *t1, *t2;
109: {
110:
111: t1->tv_sec -= t2->tv_sec;
112: t1->tv_usec -= t2->tv_usec;
113: timevalfix(t1);
114: }
115:
116: timevalfix(t1)
117: struct timeval *t1;
118: {
119:
120: if (t1->tv_usec < 0) {
121: t1->tv_sec--;
122: t1->tv_usec += 1000000;
123: }
124: if (t1->tv_usec >= 1000000) {
125: t1->tv_sec++;
126: t1->tv_usec -= 1000000;
127: }
128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.