设置套接字后,更好的做法是在套接字描述符上使用 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
但是,通常当我看到使用套接字的代码时,所有操作都使用套接字描述符而不是流。使用较低级别的功能有优势吗?