我有一个套接字sock
:
int sock = socket(...);
connect(sock, ...);
// or sock = accept(sock_listen, 0, 0);
我用fdopen打开它两次,以便我可以使用stdio
中的缓冲读写器,例如fwrite
,fread
,fgets
和{{ 1}}。
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
的内存会被泄露。
如何正确关闭它?
更新:
使用FILE
一次fdopen
使读取和写入共享相同的锁定,但我发送和接收除了单独工作。
答案 0 :(得分:2)
我认为两次调用fdopen()
是错误的原因。
只需用fdopen()
打开一次,传递模式字符串"r+b"
,使其成为读/写和二进制。
答案 1 :(得分:2)
使用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);
编辑:你当然可以将它与仅使用一个FILE对象进行读写相结合。