Should I use file descriptors or streams for reading/writing to sockets

After a socket has been setup, is it better practice to use read(2) and write(2) calls on the socket descriptor, or to associate a stream with the socket descriptor using fdopen(3) and then use stdio(3) functions?

int sfd = socket(PF_INET, SOCK_STREAM, 0);
// setup the socket using sfd
FILE * stream = fdopen(sfd, "r+");
// use fprintf, fscanf, etc

EDIT: I also unbuffer the stream

setbuf(stream, NULL)

To avoid having to flush it as mentioned in the comments.

I've been using this approach because it lets me reuse code written for FILE* streams, and I have the advantage of being able to use format strings. GNU seems to be suggesting that this is a good idea.

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

However usually when I see code using sockets, the socket descriptor is used instead of a stream for all operations. Is there an advantage to using the lower level functions?


If you need more precise control and handling of error conditions, use read and write . If you don't, and prefer the convenience of stdio functions, then use the FILE* wrapper.

One problem with using a FILE * wrapper is that you don't have control over how and when data is actually written to the socket. This can result in inefficient network utilization and excessive delays (due to Nagle's algorithm interacting with delayed ACK) if you're not careful.

I would recommend using read and write directly if this is a high-performance Internet application.

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

上一篇: 如何通过xcode“进行安装”?

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