如何使用 IOCP 发送文件?
Posted
技术标签:
【中文标题】如何使用 IOCP 发送文件?【英文标题】:How to send a file using IOCP? 【发布时间】:2015-02-24 14:44:20 【问题描述】:当使用阻塞套接字时,我发送文件所要做的就是打开文件并循环通过它并以块的形式发送。
但我发现使用重叠套接字发送文件更具挑战性。我可以想到以下方法来做到这一点:
-
我打开文件并发送第一个块,并跟踪
文件句柄和文件位置(我将这些数据存储在内存中的某处)。
现在,当我收到一个完成数据包时,表明某些数据已
已发送,我检索文件句柄和文件位置并发送下一个块。
我重复第 2 步,直到到达文件中的最后一个块,然后我
关闭文件。
这种方法正确吗?
注意:我不想使用 TransmitFile()。
编辑:我已经更新了我的问题。
【问题讨论】:
最简单的方法:在 MSDN 上查找“TransmitFile”。 这对async code sample有帮助吗? 【参考方案1】:如果您不想使用TransmitFile()
,那么您可以使用 IOCP 使用重叠文件 I/O,其中文件读取的完成用于触发套接字写入,而套接字写入的完成用于触发一个文件读取。然后,您决定在传输过程中需要多少数据,发出多少文件读取并等待 EOF...
【讨论】:
为什么投反对票?为什么不在您投反对票时发表评论,以便我可以改进答案,或者您至少可以解释您认为错误的地方。默不作声的投票无助于提高答案的质量。 嗨。两个月前我问了这个问题,你的答案就是这个问题。但是,我最近更新了我的问题以解释我的意思(如果您还没有这样做,请查看它)。我认为您的答案是对我更新的问题的正确答案,但我不确定您的意思是:“完成文件读取”,您是否假设我正在使用 Overlapped IO 从文件中读取数据? (顺便说一句,我没有对你投反对票 :-) 是的,您可以使用重叠 I/O 读取文件和重叠 I/O 将数据发送到网络。您可以一次进行一次读取(发出对文件的读取,完成后,发出写入网络(使用相同的数据缓冲区),完成后,发出另一次读取文件(使用相同的缓冲区)。最好使用多个并发读取(但它需要排序以确保在发送时保持文件读取完成的正确顺序 - 读取将按顺序完成,但如果您有多个线程为线程池提供服务...【参考方案2】:最简单的方法:在 MSDN 上查找“TransmitFile”。此功能非常常见(例如,提供网页),因此有一个特定的 API。
【讨论】:
以上是关于如何使用 IOCP 发送文件?的主要内容,如果未能解决你的问题,请参考以下文章