我应该使用文件描述符或流来读取/写入套接字

设置套接字后,最好在套接字描述符上使用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

但是,通常当我看到使用套接字的代码时,使用套接字描述符而不是所有操作的流。 使用较低级别的function是否有优势?

如果您需要更精确的控制和错误条件处理,请使用write 。 如果不这样做,并且更喜欢stdio函数的便利性,那么请使用FILE*包装器。

使用FILE *包装器的一个问题是,您无法控制数据实际写入套接字的方式和时间。 如果你不小心,这可能导致低效的网络利用率和过度延迟(由于Nagle的算法与延迟的ACK交互)。

如果这是一个高性能的Internet应用程序,我建议直接使用read