我有一个套接字sock
int sock = socket(...);
connect(sock, ...);
// or sock = accept(sock_listen, 0, 0);我用fdopen打开了两次,这样我就可以使用stdio中的缓冲阅读器和作者,比如fwrite、fread、fgets和fprintf。
FILE *f_recv = fdopen(sock, "wb");
FILE *f_send = fdopen(sock, "rb");
// some IO here.
close(sock);
fclose(f_recv);
fclose(f_send);但是,正如我们所知道的,如果我fclose一个文件,随后将调用一个close,而fclose将失败。
如果我只使用close,那么struct FILE的内存就会泄漏。
我怎样才能正确地关闭它?
更新:
使用fdopen一次和"r+"一起使读写共享相同的锁,但我除了发送和接收单独工作。
发布于 2013-09-18 08:01:03
我认为打两次电话给fdopen()是个错误,因为你给出了原因。
只需使用fdopen()打开一次,传递模式字符串"r+b"使其读/写和二进制。
发布于 2014-04-03 10:47:54
使用dup()获取传递到fdopen()的重复文件描述符。当您调用fclose()时,它将被关闭,但基础套接字将保持打开状态,并且可以用close()关闭:
FILE *f_recv = fdopen(dup(sock), "wb");
FILE *f_send = fdopen(dup(sock), "rb");
// some IO here.
fclose(f_recv);
fclose(f_send);
close(sock);编辑:当然,您可以将其与使用单个文件对象进行读写结合起来。
https://stackoverflow.com/questions/18866743
复制相似问题