vc ++ - Ftp客户端代码 - 上传文件非常慢

时间:2011-03-31 05:53:46

标签: c++ winapi visual-c++ ftp logic

我正在编写一个ftp客户端来上传文件。伪代码如下所示

{

    command_Socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    login...//

    pass.. // passive mode

    get the address from the reply ... // 

    data_Socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    connect the data_Socket to that address ..//

    open the file using createFile(....) //

    loop
    {
        char buf[1000];

        readFile and fill the buf //

        send(dataSocket,buf,..);
    }

}

现在,问题是即使我在同一台机器上传文件,上传速度也是20 kB / s。但是当一个人使用ftp上传一个文件时,通过局域网(他的机器是ubuntu),上传速度为10MB / s。我无法理解这背后的逻辑。

注意:我使用的是FileZilla FTP服务器,它能够显示客户端文件的上传/到达速度。

3 个答案:

答案 0 :(得分:1)

发布伪代码可能会隐藏重要的性能问题。所以不清楚如何填充变量buf。

但是你不应该发送1000字节的块。这可能导致TCP在服务器端更频繁地发送ACK。

答案 1 :(得分:1)

你的伪代码遗漏了一些重要的细节,但我会做一些猜测来补偿: - )

  • 尝试使您的套接字无阻塞,使用select()知道何时可以写入并写入不到64 K的块
  • 当您的套接字正在发送时(现在是异步的)您可以读取文件的下一个块

您的伪代码现在变为:

{
   command_Socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    login...//
    pass.. // passive mode
    get the address from the reply ... // 
    data_Socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    /* set data socket to non-blocking  */
    connect the data_Socket to that address ..//
    open the file using createFile(....) //
    /* read a chunk */
    loop
    {
        select
        send data
        readFile and fill the buf //
    }
}

使套接字无阻塞允许代码在套接字impl时立即返回。知道该怎么做,所以你不必在它做你需要做的事情时等待 - 这意味着你可以在发送数据时从文件中读取。

答案 2 :(得分:0)

  1. 我建议使用内存映射I / O
  2. 如果您想使用ReadFile API函数,请不要读取1000个字节。

    2.1读取2 ^ k字节(1024,2048,4096等)

    2.2每次迭代读取超过1024个字节(对于大文件,它太小)。尝试将其增加到4MB或类似的东西。你可以做这个恒定的文件大小依赖。

    2.3当前一个块通过send发送时,您可以使用异步I / O从文件中读取下一个块。

  3. 嗯...可能是其他人可以提出更多建议。