在套接字建立之後,對套接字描述符使用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
但是通常當我使用套接字看到代碼,套接字描述符是用來代替所有操作流。使用較低級別的函數是否有優勢?
請記住,C文件流默認是緩衝的,所以您必須記住在發送時自己刷新它們。即使你使socket無阻塞,讀取也可能會阻塞。 –
如果您的封裝I/O性能足夠好,並且代碼簡單,只需繼續使用即可。 – paddy
在我的觀點中,read()和write()使錯誤條件的處理更加直截了當,因爲它們不會試圖掩蓋它們中的任何一個。 – thuovila