首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确关闭用fdopen打开的套接字?

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

Stack Overflow用户
提问于 2013-09-18 07:56:51
回答 2查看 5.6K关注 0票数 4

我有一个套接字sock

代码语言:javascript
复制
int sock = socket(...);
connect(sock, ...);
 // or sock = accept(sock_listen, 0, 0);

我用fdopen打开了两次,这样我就可以使用stdio中的缓冲阅读器和作者,比如fwritefreadfgetsfprintf

代码语言:javascript
复制
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+"一起使读写共享相同的锁,但我除了发送和接收单独工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-18 08:01:03

我认为打两次电话给fdopen()是个错误,因为你给出了原因。

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

票数 2
EN

Stack Overflow用户

发布于 2014-04-03 10:47:54

使用dup()获取传递到fdopen()的重复文件描述符。当您调用fclose()时,它将被关闭,但基础套接字将保持打开状态,并且可以用close()关闭:

代码语言:javascript
复制
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);

编辑:当然,您可以将其与使用单个文件对象进行读写结合起来。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18866743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档