我有一个 socket socks
:
int sock = socket(...);
connect(sock, ...);
// or sock = accept(sock_listen, 0, 0);
并且我用fdopen打开了两次,这样就可以使用stdio
中的buffered reader和writer,比如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
,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/