gpt4 book ai didi

c# - FTP 下载速度问题 : . NET 套接字编程与使用 FtpWebRequest/Response 对象

转载 作者:行者123 更新时间:2023-11-30 17:19:33 33 4
gpt4 key购买 nike

我正在尝试编写一个简单的 C# 应用程序,它从 FTP 服务器下载大量小文件。

我尝试了两种方法:

1 - 通用套接字编程

2 - 使用 FtpWebRequest 和 FtpWebResponse 对象

使用第一种方法时的下载速度(对于同一文件)从 1.5 秒到 7 秒不等,第二种方法给出的结果相同,每次大约 2.5 秒。

考虑到这 2.5 秒中大约有 1.4 秒用于启动 FtpWebRequest 对象的过程(接收数据仅 1.1 秒),差异非常显着。

问题是第一种方法如何实现与第二种方法一样好的稳定下载速度?

对于第一种方法,问题似乎出在下面的循环中(因为它占用了大约 90% 的下载时间):

Int32 intResponseLength = dataSocket.Receive(buffer, intBufferSize, SocketFlags.None);    
while (intResponseLength != 0)
{
localFile.Write(buffer, 0, intResponseLength);
intResponseLength = dataSocket.Receive(buffer, intBufferSize, SocketFlags.None);
}

第二种方法的等效代码部分(特定文件通常需要大约 1.1 秒):

Int32 intResponseLength = ftpStream.Read(buffer, 0, intBufferSize);  
while (intResponseLength != 0)
{
localFile.Write (buffer, 0, intResponseLength);
intResponseLength = ftpStream.Read(buffer, 0, intBufferSize);
}

我试过从 56b 到 32kB 的缓冲区——没有显着差异。
同时在打开的数据套接字上创建一个流:

Stream str = new NetworkStream(dataSocket);  

并读取它(而不是使用 dataSocket.Receive)

str.Read(buffer, 0, intBufferSize);

没有帮助...事实上它甚至更慢。

提前感谢您的任何建议!

最佳答案

您需要使用 Socket.Poll 或 Socket.Select 方法来检查数据的可用性。您所做的不仅会减慢操作速度,还会导致大量 CPU 负载。轮询或选择将产生处理器时间,直到数据可用或超时结束。您可以保留相同的循环,但包括对上述方法之一的调用,并使用超时(尝试从 10 毫秒到 500 毫秒的值来找到最适合您的任务的超时)。

关于c# - FTP 下载速度问题 : . NET 套接字编程与使用 FtpWebRequest/Response 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787296/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com