TransmitFile winsock函数的文档确实说“文件”而不是“文件描述符”,所以答案可能不是吗?如果我不能使用TransmitFile通过套接字从管道发送数据,我可以使用其他一些零拷贝技术吗?
答案 0 :(得分:3)
要进行手动零拷贝传输,您需要以重叠模式打开套接字和文件,并将它们与IO完成端口关联。然后,您对文件发出读取,并在文件读取完成后,将填充的缓冲区传递给套接字上的写入。然后,您可以通过调整套接字上的发送缓冲区大小来调整此值,以防止复制,并在打开文件时选择正确的标志。
请注意,您应该使用后续套接字写入完成来驱动文件读取。也就是说,当旧的读取完成时不要继续发出新的读取,因为TCP堆栈可能会因为TCP窗口变满而最终进行流量控制,此时你将使用非页面缓冲池作为你的套接字写入需要更长时间才能完成(有关详细信息,请参阅here)。因此,决定每个连接允许的未完成套接字写入的数量,并在达到该数量时限制读取,即从读取完成时读取到写入完成时读取...
请注意,这不如使用TransmitFile()
本身那样有效,因为它避免了内核发生的用户转换,以通知您读取完成并发出写入调用。
在回答问题的第一部分时,如果尝试会发生什么?