如何正确关闭使用 fdopen 打开的套接字
How to properly close a socket opened with fdopen?
我有一个套接字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
,结构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"
传递以使其读/写和二进制。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- C++套接字对不读/写父/子
- 非更新套接字消息
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 如果我在套接字描述符上使用 fdopen(),如何关闭套接字()
- 如何正确关闭使用 fdopen 打开的套接字