如何正确关闭用fdopen打开的套接字?

时间:2013-09-18 07:56:51

标签: c++ c sockets posix glibc

我有一个套接字sock

int sock = socket(...);
connect(sock, ...);
 // or sock = accept(sock_listen, 0, 0);

我用fdopen打开它两次,以便我可以使用stdio中的缓冲读写器,例如fwritefreadfgets和{{ 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); 一个文件,则会随后调用fcloseclose将失败。

如果我只使用fclose,则结构close的内存会被泄露。

如何正确关闭它?


更新:

使用FILE一次fdopen使读取和写入共享相同的锁定,但我发送和接收除了单独工作。

2 个答案:

答案 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对象进行读写相结合。