【问题标题】:Sendfile without file descriptor没有文件描述符的发送文件
【发布时间】:2023-04-02 16:55:01
【问题描述】:

我有一个内存区域,其中包含我想通过以太网发送到其他客户端的数据。为了提高吞吐量,目前我正在摆弄 sendfile API 而不是经典的发送/写入 API。但据我了解,sendfile API 需要一个文件描述符作为输入,但我所拥有的只是原始内存数据。那么我应该怎么做才能使用 sendfile API?

【问题讨论】:

  • 创建文件?这个名字告诉你它的作用;如果您没有文件,sendfile() 不适用,是吗?
  • 我明白了,以前我认为有一种方法可以打开特定的内存区域并将文件描述符传递给 sendfile。那么在您看来,哪个更快? 1、mmap数据区域,然后使用send API重复读取内存,直到所有数据都发送完毕。 2.挂载一个ramdisk,利用内存中的数据创建一个raw文件,然后使用sendfile API发送过来。
  • 好的;让我退后一步——周围有一些非常复杂的接口,sendfile() 可能就是其中之一。但是,根据名称,您需要一个先验文件。它不是 POSIX 标准函数;它是一个 Linux 扩展。

标签: c++ c linux sockets sendfile


【解决方案1】:

sendfile() 的主要好处是它允许您避免在send() 它之前必须先将文件描述符中的read() 数据放入内存的开销。如果您要发送的数据已经在内存中,则不需要sendfile()。使用奇怪的变通方法将数据移动到文件中(例如mmap()ing)只会降低性能。

【讨论】:

    【解决方案2】:

    如果你运行 linux 你可以看看 splice

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2015-03-16
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多