📄 wrapper-new-ttcp.cpp
字号:
!= sizeof (Session_Control_Message))
ACE_ERROR_RETURN ((LM_ERROR,
"%p recv session control failed\n",
"ttcp"),
-1);
ACE_DEBUG ((LM_DEBUG, "received session control message"
" nbuf %d, size %d\n", session_control_buf.nbuf_,
session_control_buf.size_));
nbuf = session_control_buf.nbuf_;
// ignore session_control_buf.size_ for now
long cnt;
while (nbuf--)
{
if (connection_stream.recv_n ((char *) message_buf, sizeof (long))
!= sizeof (long))
ACE_ERROR_RETURN ((LM_ERROR,
"%p recv data control failed\n",
"ttcp"),
-1);
cnt = connection_stream.recv_n (& (message_buf->data_), message_buf->size_);
if (cnt != message_buf->size_)
ACE_ERROR_RETURN ((LM_ERROR, "recv data failed\n"), -1);
numCalls++;
nbytes += cnt;
if (connection_stream.send_n ((char *) &cnt, sizeof cnt)
!= sizeof cnt)
ACE_ERROR_RETURN ((LM_ERROR,
"%p send ack failed\n",
"ttcp"),
-1);
}
printf("Server finished. \n");
}
/* if (errno)
err ("IO");
*/
//
// stop the timer
//
(void) read_timer (stats, sizeof (stats));
if (udp && trans)
{
(void) Nwrite (connection_stream, message_buf, 4); /* rcvr end */
(void) Nwrite (connection_stream, message_buf, 4); /* rcvr end */
(void) Nwrite (connection_stream, message_buf, 4); /* rcvr end */
(void) Nwrite (connection_stream, message_buf, 4); /* rcvr end */
}
if (cput <= 0.0)
cput = 0.001;
if (realt <= 0.0)
realt = 0.001;
#if defined (LM_RESULTS)
if (trans && (title != 0))
{
double tmp;
FILE *fd;
char filename[BUFSIZ];
ACE_OS::sprintf (filename, "%s.results", title);
fd = fopen(filename,"a+");
if (new_line)
fprintf(fd,"\n -l %ldk \t", data_buf_len/1024);
tmp = ((double) nbytes) / realt;
fprintf(fd,"%.2f ", tmp * 8.0 / 1024.0 / 1024.0);
fclose(fd);
}
#endif
fprintf (stdout,
"ttcp%s: %ld bytes in %.2f real seconds = %s/sec +++\n",
trans ? "-t" : "-r",
nbytes, realt, outfmt (((double) nbytes) / realt));
if (verbose)
{
fprintf (stdout,
"ttcp%s: %ld bytes in %.2f CPU seconds = %s/cpu sec\n",
trans ? "-t" : "-r",
nbytes, cput, outfmt (((double) 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",
message_buf);
}
exit (0);
usage:
fprintf (stderr, Usage);
return 1;
}
void
err (char *s)
{
fprintf (stderr, "ttcp%s: ", trans ? "-t" : "-r");
perror (s);
fprintf (stderr, "errno=%d\n", errno);
exit (1);
}
void
mes (char *s)
{
fprintf (stderr, "ttcp%s: %s\n", trans ? "-t" : "-r", s);
}
void
pattern (register char *cp, register int cnt)
{
register char c;
c = 0;
while (cnt-- > 0)
{
while (!isprint ((c & 0x7F)))
c++;
*cp++ = (c++ & 0x7F);
}
}
char *
outfmt (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 itimerval itime0; /* Time at which timing started */
static struct rusage ru0; /* Resource utilization at the start */
#if defined(SYSV)
/*ARGSUSED */
static void
getrusage (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;
}
#endif /* SYSV */
/*
* P R E P _ T I M E R
*/
void
prep_timer ()
{
itime0.it_interval.tv_sec = 0;
itime0.it_interval.tv_usec = 0;
// itime0.it_value.tv_sec = LONG_MAX / 22; /* greatest possible value , itimer() count backwards */
itime0.it_value.tv_sec = 3600;
itime0.it_value.tv_usec = 0;
getrusage (RUSAGE_SELF, &ru0);
fprintf(stdout, "\n");
fprintf(stdout, "beginning user time = %d sec and %d usec\n", ru0.ru_utime.tv_sec, ru0.ru_utime.tv_usec);
fprintf(stdout, "beginning sys time = %d sec and %d usec\n", ru0.ru_stime.tv_sec, ru0.ru_stime.tv_usec);
/* Init REAL Timer */
if (setitimer (ITIMER_REAL, &itime0, 0))
{
perror ("Setting 'itimer' REAL failed");
return;
}
fprintf(stdout, "Beginning transaction time = %d sec and %d usec\n", itime0.it_value.tv_sec, itime0.it_value.tv_usec);
}
/*
* R E A D _ T I M E R
*
*/
double
read_timer (char *str, int len)
{
struct itimerval itimedol;
struct rusage ru1;
struct timeval td;
struct timeval tend, tstart;
char line[132];
getrusage (RUSAGE_SELF, &ru1);
fprintf(stdout, "final user time = %d sec and %d usec\n", ru1.ru_utime.tv_sec, ru1.ru_utime.tv_usec);
fprintf(stdout, "final sys time = %d sec and %d usec\n", ru1.ru_stime.tv_sec, ru1.ru_stime.tv_usec);
if (getitimer (ITIMER_REAL, &itimedol))
{
perror ("Getting 'itimer' REAL failed");
return (0.0);
}
fprintf(stdout, "End transaction time = %d sec and %d usec\n", itimedol.it_value.tv_sec, itimedol.it_value.tv_usec);
prusage (&ru0, &ru1, &itime0.it_value, &itimedol.it_value, line);
(void) strncpy (str, line, len);
/* Get real time */
tvsub (&td, &itime0.it_value, &itimedol.it_value);
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 void
prusage (register struct rusage *r0, struct rusage *r1,
struct timeval *b, struct timeval *e, 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) * 1000 +
(r1->ru_utime.tv_usec - r0->ru_utime.tv_usec) / 100000 +
(r1->ru_stime.tv_sec - r0->ru_stime.tv_sec) * 1000 +
(r1->ru_stime.tv_usec - r0->ru_stime.tv_usec) / 100000;
ms = -((e->tv_sec - b->tv_sec) * 1000 + (e->tv_usec - b->tv_usec) / 1000);/* in milliseconds */
#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 = "%Uutime %Sstime %Edtime %P cpu occupancy";
/* 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);*/
sprintf (outp, "%f", (tdiff.tv_sec + tdiff.tv_usec/1000000.0));
END (outp);
break;
case 'S':
tvsub (&tdiff, &r1->ru_stime, &r0->ru_stime);
/* sprintf (outp, "%d.%01d", tdiff.tv_sec, tdiff.tv_usec);*/
sprintf (outp, "%f", (tdiff.tv_sec + tdiff.tv_usec/1000000.0));
END (outp);
break;
case 'E':
psecs (ms / 1000, outp);
END (outp);
break;
case 'P':
sprintf (outp, "%f%%", (t * 100.0 / ((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 void
tvadd (struct timeval *tsum, struct timeval *t0, struct timeval *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 void
tvsub (struct timeval *tdiff, struct timeval *t1, struct timeval *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 void
psecs (long l, register char *cp)
{
register int i;
i = l / 3600;
if (i)
{
sprintf (cp, "%d hours", i);
END (cp);
i = l % 3600;
sprintf (cp, "%d minutes ", (i / 60));
sprintf (cp, "%d seconds ", (i % 60));
END (cp);
}
else
{
i = l;
sprintf (cp, "%d minutes ", i / 60);
END (cp);
}
i %= 60;
*cp++ = ':';
sprintf (cp, "%d seconds ", i);
}
/*
* N R E A D
*/
int
Nread (ACE_SOCK_Stream &s, void *buf, int count)
{
numCalls++;
return (s.recv (buf, count));
}
/*
* N W R I T E
*/
int
Nwrite (ACE_SOCK_Stream &s, void *buf, int count)
{
numCalls++;
return s.send (buf, count);
}
void
delay (int 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.
*/
int
mread (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 + -