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

时间:2013-02-04 11:24:00

标签: 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

编辑:我也解密了流

setbuf(stream, NULL)

避免按照评论中的提及进行冲洗。

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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