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

在套接字建立之后,对套接字描述符使用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

编辑:我也unbuffer流

setbuf(stream, NULL)

避免按照评论中提到的那样刷新它。

我一直在使用这种方法,因为它可以让我重新使用为FILE *流编写的代码,并且我有能够使用格式字符串的优势。 GNU似乎暗示这是一个好主意。

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

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


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

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

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

链接地址: http://www.djcxy.com/p/11799.html

上一篇: Should I use file descriptors or streams for reading/writing to sockets

下一篇: multicore and data.table in R