2014-09-03 77 views
1

我有一个内存区域,其中包含我想通过以太网发送到另一个客户端的数据。为了增加吞吐量,目前我在摆弄sendfile API而不是传统的发送/写入API。但据我所知,sendfile API需要输入文件描述符,但我所拥有的只是原始内存数据。那么为了使用sendfile API我该怎么做?发送文件没有文件描述符

+1

创建一个文件?这个名字告诉你它做了什么;如果你没有文件,'sendfile()'不适用,是吗? – 2014-09-03 02:49:48

+1

我看,以前我认为有一种方法可以打开特定的内存区域并将文件描述符传递给sendfile。那么你认为哪一个更快? 1. mmap数据区域,然后使用发送API重复读取内存,直到发送所有数据。 2.安装ramdisk,使用内存中的数据创建原始文件,然后使用sendfile API发送。 – czteoh 2014-09-03 03:29:24

+0

好的;让我退后一步 - 周围有一些非常复杂的接口,'sendfile()'可能就是其中之一。但是,先验,并根据名称,你需要一个文件。它不是POSIX标准功能;它是一个Linux扩展。 – 2014-09-03 03:39:37

回答

3

sendfile()的主要好处是,它允许你避免不必首先read()数据从一个文件描述符到内存中,然后才能send()它的开销。如果要发送的数据已经在内存中,则不需要sendfile()。使用奇怪的解决方法将数据移动到文件中(如mmap())只会降低性能。

-1

如果你正在运行linux,你可以看看splice

+0

['* splice()*在两个文件描述符之间移动数据...其中一个描述符必须引用管道'](http://linux.die.net/man/2/splice)。这里既没有文件描述符也没有管道。 – EJP 2015-02-22 23:07:27

+0

我对这个触发器太快了 – rouzier 2015-02-23 16:27:05