11

设置套接字后,更好的做法是在套接字描述符上使用 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

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

4

1 回答 1

5

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

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

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

于 2013-02-04T11:42:07.057 回答