Solaris FTP客户端实现

时间:2014-08-26 15:13:16

标签: java ftp solaris ftp-client

我有用java编写的FTP服务器。没有实现计算速度。

但是当我使用Solaris FTP客户端或winSCP并连接到我的ftp服务器并传输文件时,它会在最后显示速度,如:

380352 bytes sent in 0.72 seconds (51562.34 Kbytes/s)

任何人都可以帮我告诉我这个速度计算是如何实现的。或者甚至指导我应该从哪里开始寻找。

1 个答案:

答案 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,找到startstop之间的差异,将其转换为浮点数,确保时差不为零,然后除{{1}按时差并以每秒千字节打印结果。