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

标签 c++ c sockets posix glibc

我有一个 socket socks :

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

并且我用fdopen打开了两次,这样就可以使用stdio中的buffered reader和writer,比如fwrite, fread , fgetsfprintf

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+" 使读取和写入共享同一个锁,但我除了发送和接收单独工作。

最佳答案

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

关于c++ - 如何正确关闭用 fdopen 打开的套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18866743/

相关文章:

C++ 在 unordered_map 中添加新对象的最佳方法

c++ - 在 MFC 中禁用 CheckedListBox 中的项目

c - 进程返回 -1 (0xFFFFFFFF)

我可以重用连接到不同主机的(临时)端口吗?

sockets - 服务器和客户端可以使用同一个套接字吗?

c++ - 为什么GCC会说 “a function-definition is not allowed here before ' {' token”?

c++ - 如何从正在运行的 VC++ 项目生成 DLL?

c - 原始数据类型的通用存储

c - *char 数组末尾的段错误

Ruby http-2 实现 : how does eof work?