为什么与其他方法相比,我对TransmitFile的调用表现不佳?

时间:2010-01-04 23:07:15

标签: c++ winsock transmitfile

首先,有点背景 - 我正在为个人项目编写基本的FTP服务器。我目前正在检索文件。我目前的实现如下:

HANDLE hFile = CreateFile("file.tar.gz", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
TransmitFile(sd, hFile, fileSize, 65536, NULL, NULL, TF_USE_KERNEL_APC | TF_WRITE_BEHIND); 
CloseHandle(hFile);

它有效,但性能值得怀疑。首先,传输以大约10 MB / s开始,但缓慢降低到大约3 MB / s。使用FileZilla Server和IIS FTP,它可以保持一致的> 30 MB / s传输速度。因此,我知道它没有全力以赴。我已经尝试过修改缓冲区大小,但它没有改善性能。   如果有人对更有效的方式传输文件有任何建议,请告诉我。 API文档似乎表明TransmitFile已针对我的应用程序进行了优化,这就是我选择使用它的原因   [请原谅我缺乏Windows API知识。]

此外,所有套接字都在localhost上打开。

3 个答案:

答案 0 :(得分:3)

您是否通过在开始传输之前设置SO_SNDBUFSO_RCVBUF套接字选项来增加套接字的TCP缓冲区大小(以及可能的TCP窗口大小)? (在绑定之后和连接之前这样做?)

从问题的声音,更快的启动然后减慢,我猜它是一个TCP流量控制问题(可能是由于TCP窗口比你想要的小)。使用Wireshark查看数据流会很有用(理想情况是我在上面建议的更改之前和之后)。

请参阅:

答案 1 :(得分:0)

似乎MSDN在这里没什么帮助,除了它确认TransmitFile应该是在这里使用的正确功能。你有没试过这个?

  

HFILE

     

TransmitFile函数传输的打开文件的句柄。以来   操作系统读取文件   数据顺序,你可以改进   通过打开缓存性能   处理FILE_FLAG_SEQUENTIAL_SCAN。

编辑:我建议的下一步是检查FileZilla是如何做到的(它是开源的,不是吗?)。也许使用Windows API并不是完美的方法,尽管TransmitFile被称为高性能功能。

答案 2 :(得分:-1)

我尝试将TransmitFile添加到我的代码中,但性能非常糟糕。在开始下载之前,它会在那里坐20秒钟。

我已经读到它似乎在某种程度上是异步的,尽管在任何地方都没有明确记录。此外,如果您在错误的时间执行某些操作,它听起来会导致您的应用程序崩溃: social.msdn.microsoft.com

文档不好,性能不佳==请勿在我的书中使用。它是两行C#将文件加载到byte []并将其写入输出...