【问题标题】:Does TransmitFile work on pipes?TransmitFile 是否适用于管道?
【发布时间】:2011-01-13 02:53:32
【问题描述】:

TransmitFilewinsock 函数的文档确实说“文件”而不是“文件描述符”,所以也许答案是否定的?如果我不能使用 TransmitFile 通过套接字从管道发送数据,是否可以使用其他零拷贝技术?

【问题讨论】:

    标签: c winapi winsock


    【解决方案1】:

    要进行手动零拷贝传输,您需要以重叠模式打开套接字和文件,并将它们与 IO 完成端口相关联。然后,您对文件发出读取操作,当文件读取完成时,您将已填充的缓冲区传递给套接字上的写入操作。然后,您可以通过调整套接字上的发送缓冲区大小以防止复制并在打开文件时选择正确的标志来调整它。

    请注意,您可能应该使用随后的套接字写入完成来驱动您的文件读取。也就是说,当旧的读取完成时不要继续发出新的读取,因为 TCP 堆栈可能会由于 TCP 窗口变满而最终进行流量控制,此时您将使用非分页池作为您的套接字写入需要越来越长的时间才能完成(有关更多详细信息,请参阅here)。因此,决定每个连接允许的未完成套接字写入的数量,并在达到该数量时限制您的读取,也就是说,从读取完成时读取切换到写入完成时读取......

    请注意,这不如使用TransmitFile() 本身有效,因为它避免了内核到用户的转换,以通知您读取完成并发出写入调用。

    在回答您问题的第一部分时,如果您尝试会发生什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多