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

szm*_*ore 9 c sockets file-io

设置套接字后,最好在套接字描述符上使用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
Run Code Online (Sandbox Code Playgroud)

编辑:我也解密流

setbuf(stream, NULL)
Run Code Online (Sandbox Code Playgroud)

为避免必须按照评论中的提及进行刷新.

我一直在使用这种方法,因为它允许我重用为FILE*流编写的代码,并且我的优点是能够使用格式字符串(我正在使用人类可读的文本).GNU似乎暗示这是一个好主意.

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

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

Dav*_*rtz 5

如果您需要更精确的控制和错误条件的处理,请使用readwrite.如果你没有,并且更喜欢stdio函数的便利性,那么使用FILE*包装器.

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

我会建议使用readwrite直接,如果这是一个高性能的互联网应用.