2014-09-03 91 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