⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ttcp.c

📁 网络测试
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -