📄 ttcp.c
字号:
trans?"-t":"-r", buf); } close(fd);#if 0 fprintf(stdout, "post close: rcvq_append: %d rcvq_dequeue: %d\n", rcvq_append_count, rcvq_dequeue_count);#endif return 0;usage: close(fd); fprintf(stderr,Usage); return 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);}void 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;}#ifdef TEST_BSDstatic 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 );}#elseunsigned long time0;void prep_timer(){ time0 = GLUE_NOW(); printf("prep: %ld\n", time0);}doubleread_timer(str,len)char *str;{ unsigned long timeN = GLUE_NOW(); printf("end: %ld\n", timeN); realt = ((double)(timeN - time0))/1000.0; cput = realt; return cput;}#endif#define END(x) {while(*x) x++;}#ifdef TEST_BSDstatic 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;#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,"%ld.%01ld", tdiff.tv_sec, tdiff.tv_usec/100000); END(outp); break; case 'S': tvsub(&tdiff, &r1->ru_stime, &r0->ru_stime); sprintf(outp,"%ld.%01ld", 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,"%ld", t == 0 ? 0 : (r1->ru_ixrss-r0->ru_ixrss)/t); END(outp); break; case 'D': sprintf(outp,"%ld", t == 0 ? 0 : (r1->ru_idrss+r1->ru_isrss-(r0->ru_idrss+r0->ru_isrss))/t); END(outp); break; case 'K': sprintf(outp,"%ld", 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,"%ld", r1->ru_maxrss/2); END(outp); break; case 'F': sprintf(outp,"%ld", r1->ru_majflt-r0->ru_majflt); END(outp); break; case 'R': sprintf(outp,"%ld", r1->ru_minflt-r0->ru_minflt); END(outp); break; case 'I': sprintf(outp,"%ld", r1->ru_inblock-r0->ru_inblock); END(outp); break; case 'O': sprintf(outp,"%ld", r1->ru_oublock-r0->ru_oublock); END(outp); break; case 'C': sprintf(outp,"%ld+%ld", r1->ru_nvcsw-r0->ru_nvcsw, r1->ru_nivcsw-r0->ru_nivcsw ); END(outp); break;#endif /* !SYSV */ } } *outp = '\0';}#endif#ifdef TEST_BSDstatic 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);}#endif#ifdef SHOW_SEQunsigned long seqrec[256];unsigned long lastseq = 0;void recordseq(char *bufP){ unsigned char *lbuf = (unsigned char *)bufP; unsigned long seq = (lbuf[0] << 24) + (lbuf[1] << 16) + (lbuf[2]<<8) + lbuf[3]; if (lastseq < 256) seqrec[lastseq++] = seq;}void resetseq(){ lastseq = 0;}void dumpseq(){ unsigned long i; unsigned long lastn = seqrec[0]; unsigned long lastp; printf("%lu", lastn); lastp=lastn; for (i=1; i<lastseq-1; i++) { if (seqrec[i] == (lastn+1)) { lastn++; continue; } if (lastp != lastn) { printf("..%lu", lastn); } lastn = seqrec[i]; printf(",%lu", lastn); lastp = lastn; } if (seqrec[lastseq-1] == (lastn+1)) { printf("..%lu\n", lastn+1); } else { if (lastp != lastn) printf("..%lu", lastn); printf(",%lu\n", seqrec[lastseq-1]); } printf("\n");}#endif/* * N R E A D */int Nread( rfd, rbuf, count )int rfd;void *rbuf;int count;{ struct sockaddr_in from; int len = sizeof(from); register int cnt; if( udp ) { cnt = recvfrom( rfd, rbuf, count, 0, (struct sockaddr *)&from, &len );#ifdef SHOW_SEQ recordseq(rbuf);#endif numCalls++; } else { if( b_flag ) cnt = mread( rfd, rbuf, count ); /* fill rbuf */ else { cnt = recv( rfd, rbuf, count, 0 ); numCalls++; } if (touchdata && cnt > 0) { register int c = cnt, sum; register char *b = rbuf; while (c--) sum += *b++; } } return(cnt);}/* * N W R I T E */int Nwrite( wfd, wbuf, count )int wfd;void *wbuf;int count;{ unsigned char *wbufn = wbuf; register int cnt; if( udp ) {again: wbufn[3] = numCalls & 0xff; wbufn[2] = (numCalls >> 8) & 0xff; wbufn[1] = (numCalls >> 16) & 0xff; wbufn[0] = (numCalls >> 24) & 0xff; cnt = sendto( wfd, wbuf, count, 0, (struct sockaddr *)&sinhim, sizeof(sinhim) ); if( cnt<0 && errno == ENOBUFS ) { delay(18000); errno = 0; goto again; } numCalls++; } else { cnt = send( wfd, wbuf, count, 0 ); numCalls++; } return(cnt);}voidstatic delay(us){ struct timeval tv; tv.tv_sec = 0; tv.tv_usec = us; (void)select( 1, (fd_set *)0, (fd_set *)0, (fd_set *)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(rfd, bufp, n)int rfd;register char *bufp;unsigned n;{ register unsigned count = 0; register int nread; do { nread = recv(rfd, bufp, n-count, 0); 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 + -