了解 sendfile() 和 splice()

发布于 2024-12-22 13:24:54 字数 233 浏览 2 评论 0原文

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

sendfile() can be used to transmit data from a "file" descriptor to a "socket" descriptor in order to get data from machine A to machine B. Is it possible to get the data at the receiving end from the "socket" descriptor to a file with similar zero-copy semantics? I think sendfile() doesn't help here because sendfile() needs the source of data to be "page/buffer" cache. Is my understanding correct? Can splice() help in this situation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

独享拥抱 2024-12-29 13:24:54

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

从概念上讲,您可以做的就是:

  • 设置入站套接字 fd 和输出文件 fd,就像通常使用
  • pipe(2)
  • 循环:
  • 从套接字读取到管道的写入端与 splice
  • 使用splice从管道的读取端写入文件也

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

Linux 中使用 sendfile() 和 splice( ) 有此技术的实现。

You're correct about the limitation of sendfile for this. And yes, splice can help, but it's not trivial: splice requires that at least one of the source or target file descriptors be a pipe. So you can't directly splice from a socket to a plain file descriptor.

Conceptually, what you can do to make it work is:

  • setup your inbound socket fd and your output file fd as you would normally
  • create a pipe with pipe(2)
  • in a loop:
  • read from the socket to the write side of the pipe with splice
  • write from the read side of the pipe to the file with splice also

Repeat the last steps until all the data is read.

Zero-Copy in Linux with sendfile() and splice() has an implementation of this technique.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文