如何使用 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 发送文件?的主要内容,如果未能解决你的问题,请参考以下文章

Win IOCP下如何识别pushback?

IOCP 接收和发送

IOCP 服务器并使用单个 wsasend 发送数据

IOCP 服务器的非 IOCP 客户端发送/接收错误

向多线程 iocp 服务器中的新连接用户发送连接用户列表

WSA 发送到多线程 iocp 服务器中的所有连接的套接字