📄 ttcp.c
字号:
trans?"-t":"-r", nbytes, cput, outfmt(nbytes/cput)); } fprintf(stdout, "ttcp%s: %d I/O calls, msec/call = %.2f, calls/sec = %.2f\n", trans?"-t":"-r", numCalls, 1024.0 * realt/((double)numCalls), ((double)numCalls)/realt); fprintf(stdout,"ttcp%s: %s\n", trans?"-t":"-r", stats); if (verbose) { fprintf(stdout, "ttcp%s: buffer address %#x\n", trans?"-t":"-r", buf); } exit(0);usage: fprintf(stderr,Usage); exit(1);}voiderr(s)char *s;{ fprintf(stderr,"ttcp%s: ", trans?"-t":"-r"); perror(s); fprintf(stderr,"errno=%d\n",errno); exit(1);}voidmes(s)char *s;{ fprintf(stderr,"ttcp%s: %s\n", trans?"-t":"-r", s);}pattern( cp, cnt )register char *cp;register int cnt;{ register char c; c = 0; while( cnt-- > 0 ) { while( !isprint((c&0x7F)) ) c++; *cp++ = (c++&0x7F); }}char *outfmt(b)double b;{ static char obuf[50]; switch (fmt) { case 'G': sprintf(obuf, "%.2f GB", b / 1024.0 / 1024.0 / 1024.0); break; default: case 'K': sprintf(obuf, "%.2f KB", b / 1024.0); break; case 'M': sprintf(obuf, "%.2f MB", b / 1024.0 / 1024.0); break; case 'g': sprintf(obuf, "%.2f Gbit", b * 8.0 / 1024.0 / 1024.0 / 1024.0); break; case 'k': sprintf(obuf, "%.2f Kbit", b * 8.0 / 1024.0); break; case 'm': sprintf(obuf, "%.2f Mbit", b * 8.0 / 1024.0 / 1024.0); break; } return obuf;}static struct timeval time0; /* Time at which timing started */static struct rusage ru0; /* Resource utilization at the start */static void prusage();static void tvadd();static void tvsub();static void psecs();#if defined(SYSV)/*ARGSUSED*/staticgetrusage(ignored, ru) int ignored; register struct rusage *ru;{ struct tms buf; times(&buf); /* Assumption: HZ <= 2147 (LONG_MAX/1000000) */ ru->ru_stime.tv_sec = buf.tms_stime / HZ; ru->ru_stime.tv_usec = ((buf.tms_stime % HZ) * 1000000) / HZ; ru->ru_utime.tv_sec = buf.tms_utime / HZ; ru->ru_utime.tv_usec = ((buf.tms_utime % HZ) * 1000000) / HZ;}/*ARGSUSED*/static gettimeofday(tp, zp) struct timeval *tp; struct timezone *zp;{ tp->tv_sec = time(0); tp->tv_usec = 0;}#endif /* SYSV *//* * P R E P _ T I M E R */voidprep_timer(){ gettimeofday(&time0, (struct timezone *)0); getrusage(RUSAGE_SELF, &ru0);}/* * R E A D _ T I M E R * */doubleread_timer(str,len)char *str;{ struct timeval timedol; struct rusage ru1; struct timeval td; struct timeval tend, tstart; char line[132]; getrusage(RUSAGE_SELF, &ru1); gettimeofday(&timedol, (struct timezone *)0); prusage(&ru0, &ru1, &timedol, &time0, line); (void)strncpy( str, line, len ); /* Get real time */ tvsub( &td, &timedol, &time0 ); realt = td.tv_sec + ((double)td.tv_usec) / 1000000; /* Get CPU time (user+sys) */ tvadd( &tend, &ru1.ru_utime, &ru1.ru_stime ); tvadd( &tstart, &ru0.ru_utime, &ru0.ru_stime ); tvsub( &td, &tend, &tstart ); cput = td.tv_sec + ((double)td.tv_usec) / 1000000; if( cput < 0.00001 ) cput = 0.00001; return( cput );}static voidprusage(r0, r1, e, b, outp) register struct rusage *r0, *r1; struct timeval *e, *b; char *outp;{ struct timeval tdiff; register time_t t; register char *cp; register int i; int ms; t = (r1->ru_utime.tv_sec-r0->ru_utime.tv_sec)*100+ (r1->ru_utime.tv_usec-r0->ru_utime.tv_usec)/10000+ (r1->ru_stime.tv_sec-r0->ru_stime.tv_sec)*100+ (r1->ru_stime.tv_usec-r0->ru_stime.tv_usec)/10000; ms = (e->tv_sec-b->tv_sec)*100 + (e->tv_usec-b->tv_usec)/10000;#define END(x) {while(*x) x++;}#if defined(SYSV) cp = "%Uuser %Ssys %Ereal %P";#else#if defined(sgi) /* IRIX 3.3 will show 0 for %M,%F,%R,%C */ cp = "%Uuser %Ssys %Ereal %P %Mmaxrss %F+%Rpf %Ccsw";#else cp = "%Uuser %Ssys %Ereal %P %Xi+%Dd %Mmaxrss %F+%Rpf %Ccsw";#endif#endif for (; *cp; cp++) { if (*cp != '%') *outp++ = *cp; else if (cp[1]) switch(*++cp) { case 'U': tvsub(&tdiff, &r1->ru_utime, &r0->ru_utime); sprintf(outp,"%d.%01d", tdiff.tv_sec, tdiff.tv_usec/100000); END(outp); break; case 'S': tvsub(&tdiff, &r1->ru_stime, &r0->ru_stime); sprintf(outp,"%d.%01d", tdiff.tv_sec, tdiff.tv_usec/100000); END(outp); break; case 'E': psecs(ms / 100, outp); END(outp); break; case 'P': sprintf(outp,"%d%%", (int) (t*100 / ((ms ? ms : 1)))); END(outp); break;#if !defined(SYSV) case 'W': i = r1->ru_nswap - r0->ru_nswap; sprintf(outp,"%d", i); END(outp); break; case 'X': sprintf(outp,"%d", t == 0 ? 0 : (r1->ru_ixrss-r0->ru_ixrss)/t); END(outp); break; case 'D': sprintf(outp,"%d", t == 0 ? 0 : (r1->ru_idrss+r1->ru_isrss-(r0->ru_idrss+r0->ru_isrss))/t); END(outp); break; case 'K': sprintf(outp,"%d", t == 0 ? 0 : ((r1->ru_ixrss+r1->ru_isrss+r1->ru_idrss) - (r0->ru_ixrss+r0->ru_idrss+r0->ru_isrss))/t); END(outp); break; case 'M': sprintf(outp,"%d", r1->ru_maxrss/2); END(outp); break; case 'F': sprintf(outp,"%d", r1->ru_majflt-r0->ru_majflt); END(outp); break; case 'R': sprintf(outp,"%d", r1->ru_minflt-r0->ru_minflt); END(outp); break; case 'I': sprintf(outp,"%d", r1->ru_inblock-r0->ru_inblock); END(outp); break; case 'O': sprintf(outp,"%d", r1->ru_oublock-r0->ru_oublock); END(outp); break; case 'C': sprintf(outp,"%d+%d", r1->ru_nvcsw-r0->ru_nvcsw, r1->ru_nivcsw-r0->ru_nivcsw ); END(outp); break;#endif /* !SYSV */ } } *outp = '\0';}static voidtvadd(tsum, t0, t1) struct timeval *tsum, *t0, *t1;{ tsum->tv_sec = t0->tv_sec + t1->tv_sec; tsum->tv_usec = t0->tv_usec + t1->tv_usec; if (tsum->tv_usec > 1000000) tsum->tv_sec++, tsum->tv_usec -= 1000000;}static voidtvsub(tdiff, t1, t0) struct timeval *tdiff, *t1, *t0;{ tdiff->tv_sec = t1->tv_sec - t0->tv_sec; tdiff->tv_usec = t1->tv_usec - t0->tv_usec; if (tdiff->tv_usec < 0) tdiff->tv_sec--, tdiff->tv_usec += 1000000;}static voidpsecs(l,cp)long l;register char *cp;{ register int i; i = l / 3600; if (i) { sprintf(cp,"%d:", i); END(cp); i = l % 3600; sprintf(cp,"%d%d", (i/60) / 10, (i/60) % 10); END(cp); } else { i = l; sprintf(cp,"%d", i / 60); END(cp); } i %= 60; *cp++ = ':'; sprintf(cp,"%d%d", i / 10, i % 10);}/* * N R E A D */Nread( fd, buf, count )int fd;void *buf;int count;{ struct sockaddr_in from; int len = sizeof(from); register int cnt; if( udp ) { cnt = recvfrom( fd, buf, count, 0, &from, &len ); numCalls++; } else { if( b_flag ) cnt = mread( fd, buf, count ); /* fill buf */ else { cnt = read( fd, buf, count ); numCalls++; } if (touchdata && cnt > 0) { register int c = cnt, sum; register char *b = buf; while (c--) sum += *b++; } } return(cnt);}/* * N W R I T E */Nwrite( fd, buf, count )int fd;void *buf;int count;{ register int cnt; if( udp ) {again: cnt = sendto( fd, buf, count, 0, &sinhim, sizeof(sinhim) ); numCalls++; if( cnt<0 && errno == ENOBUFS ) { delay(18000); errno = 0; goto again; } } else { cnt = write( fd, buf, count ); numCalls++; } return(cnt);}voiddelay(us){ struct timeval tv; tv.tv_sec = 0; tv.tv_usec = us; (void)select( 1, (char *)0, (char *)0, (char *)0, &tv );}/* * M R E A D * * This function performs the function of a read(II) but will * call read(II) multiple times in order to get the requested * number of characters. This can be necessary because * network connections don't deliver data with the same * grouping as it is written with. Written by Robert S. Miles, BRL. */intmread(fd, bufp, n)int fd;register char *bufp;unsigned n;{ register unsigned count = 0; register int nread; do { nread = read(fd, bufp, n-count); numCalls++; if(nread < 0) { perror("ttcp_mread"); return(-1); } if(nread == 0) return((int)count); count += (unsigned)nread; bufp += nread; } while(count < n); return((int)count);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -