我正在编写一个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服务器,它能够显示客户端文件的上传/到达速度。
答案 0 :(得分:1)
发布伪代码可能会隐藏重要的性能问题。所以不清楚如何填充变量buf。
但是你不应该发送1000字节的块。这可能导致TCP在服务器端更频繁地发送ACK。
答案 1 :(得分:1)
你的伪代码遗漏了一些重要的细节,但我会做一些猜测来补偿: - )
您的伪代码现在变为:
{
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)
如果您想使用ReadFile
API函数,请不要读取1000个字节。
2.1读取2 ^ k字节(1024,2048,4096等)
2.2每次迭代读取超过1024个字节(对于大文件,它太小)。尝试将其增加到4MB或类似的东西。你可以做这个恒定的文件大小依赖。
2.3当前一个块通过send
发送时,您可以使用异步I / O从文件中读取下一个块。
嗯...可能是其他人可以提出更多建议。