2013-02-04 30 views
7

在套接字建立之後,對套接字描述符使用read(2)和write(2)調用,還是將流與套接字描述符使用fdopen(3)然後使用stdio(3)函數?我應該使用文件描述符還是流來讀取/寫入套接字

int sfd = socket(PF_INET, SOCK_STREAM, 0); 
// setup the socket using sfd 
FILE * stream = fdopen(sfd, "r+"); 
// use fprintf, fscanf, etc 

編輯:我也無緩衝的流

setbuf(stream, NULL) 

爲了避免如在評論中提到沖洗它。

我一直在使用這種方法,因爲它可以讓我重新使用爲FILE *流編寫的代碼,並且我可以使用格式化字符串的優勢。 GNU似乎暗示這是一個好主意。

http://www.gnu.org/software/libc/manual/html_node/Streams-and-File-Descriptors.html

但是通常當我使用套接字看到代碼,套接字描述符是用來代替所有操作流。使用較低級別的函數是否有優勢?

+3

請記住,C文件流默認是緩衝的,所以您必須記住在發送時自己刷新它們。即使你使socket無阻塞,讀取也可能會阻塞。 –

+0

如果您的封裝I/O性能足夠好,並且代碼簡單,只需繼續使用即可。 – paddy

+1

在我的觀點中,read()和write()使錯誤條件的處理更加直截了當,因爲它們不會試圖掩蓋它們中的任何一個。 – thuovila

回答

3

如果您需要更精確的控制和處理錯誤條件,請使用readwrite。如果您不這樣做,並且更喜歡stdio功能的便利,那麼請使用FILE*包裝。

使用FILE *包裝的一個問題是,您無法控制數據實際寫入套接字的方式和時間。如果你不小心,這可能導致網絡利用效率低下和延遲過長(由於Nagle的算法與延遲ACK進行交互)。

如果這是一個高性能的Internet應用程序,我會建議直接使用readwrite

+0

那麼,使用'recv'和'send'就可以實現更精確的控制,因爲它們允許指定標誌,如'MSG_NOSIGNAL'。 –

相關問題