在设置套接字之后,最好在套接字描述符上使用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
但是,通常当我看到使用套接字的代码时,使用套接字描述符而不是所有操作的流。使用较低级别的功能是否有优势?
答案 0 :(得分:5)
如果您需要更精确的控制和错误条件处理,请使用read
和write
。如果不这样做,并且更喜欢stdio函数的便利性,那么请使用FILE*
包装器。
使用FILE *
包装器的一个问题是,您无法控制数据实际写入套接字的方式和时间。如果你不小心,这会导致网络利用效率低下和延迟过多(由于Nagle的算法与延迟的ACK交互)。
如果这是一个高性能的互联网应用,我建议您直接使用read
和write
。