10

sendfile()可用于将数据从“文件”描述符传输到“套接字”描述符,以便从机器A到机器B获取数据。是否可以在接收端从“套接字”描述符获取数据到文件具有类似的零拷贝语义?我认为sendfile()这里没有帮助,因为sendfile()需要数据源是“页面/缓冲区”缓存。我的理解正确吗?splice()在这种情况下可以提供帮助吗?

4

1 回答 1

16

您对此的限制是正确的sendfile。是的,splice可以提供帮助,但这不是微不足道的:splice要求至少一个源或目标文件描述符是管道。所以你不能直接splice从一个套接字到一个普通的文件描述符。

从概念上讲,您可以做些什么来使其发挥作用:

  • 像往常一样设置入站套接字 fd 和输出文件 fd
  • 创建一个管道pipe(2)
  • 在一个循环中:
    • 从套接字读取到管道的写入端splice
    • splice也可以从管道的读取端写入文件

重复最后的步骤,直到读取所有数据。

Linux 中使用 sendfile() 和 splice() 进行的零复制实现了这种技术。

于 2011-12-24T19:08:33.143 回答