我有用java编写的FTP服务器。没有实现计算速度。
但是当我使用Solaris FTP客户端或winSCP并连接到我的ftp服务器并传输文件时,它会在最后显示速度,如:
380352 bytes sent in 0.72 seconds (51562.34 Kbytes/s)
任何人都可以帮我告诉我这个速度计算是如何实现的。或者甚至指导我应该从哪里开始寻找。
答案 0 :(得分:0)
这是netkit-ftp中传输文件的简化版本,显示了如何计算传输速率。
recvrequest(...)
{
volatile off_t bytes = 0;
struct timeval start, stop;
gettimeofday(&start, (struct timezone *)0);
while ((c = read(fileno(din), buf, bufsize)) > 0) {
if ((d = write(fileno(fout), buf, c)) != c)
break;
bytes += c;
}
gettimeofday(&stop, (struct timezone *)0);
ptransfer("received", bytes, &start, &stop);
}
ptransfer(const char *direction, off_t bytes,
const struct timeval *t0,
const struct timeval *t1)
{
struct timeval td;
float s, bs;
tvsub(&td, t1, t0);
s = td.tv_sec + (td.tv_usec / 1000000.);
#define nz(x) ((x) == 0 ? 1 : (x))
bs = bytes / nz(s);
printf("%jd bytes %s in %.2f secs (%.1f kB/s)\n",
(intmax_t) bytes, direction, s, bs / 1024.0);
}
步骤如下:
start
bytes
stop
ptransfer
,找到start
和stop
之间的差异,将其转换为浮点数,确保时差不为零,然后除{{1}按时差并以每秒千字节打印结果。