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

How to properly close a socket opened with fdopen?

本文关键字:套接字 fdopen 何正确      更新时间:2023-10-16

我有一个套接字sock

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

而且我用fdopen打开了两次,这样我就可以在stdio中使用缓冲的阅读器和写入器,比如fwritefreadfgetsfprintf

FILE *f_recv = fdopen(sock, "wb");
FILE *f_send = fdopen(sock, "rb");
// some IO here.
close(sock);
fclose(f_recv);
fclose(f_send);

但正如我们所知,如果我fclose一个文件,随后将调用一个closefclose将失败。

如果我只使用close,结构FILE的内存就会泄露。

如何正确关闭它?


更新:

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

使用 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对象进行读取和写入相结合。

我认为由于

您给出的原因,两次打电话给fdopen()是一个错误。

只需用fdopen()打开它一次,将模式字符串"r+b"传递以使其读/写和二进制。