4

我有一个插座sock

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

并且我用fdopen打开了两次,这样我就可以使用缓冲的读写器了,stdio比如fwrite,,和。freadfgetsfprintf

FILE *f_recv = fdopen(sock, "wb");
FILE *f_send = fdopen(sock, "rb");

// some IO here.

close(sock);
fclose(f_recv);
fclose(f_send);

但是我们知道,如果我fclose是一个文件,aclose将随后被调用,并且fclose会失败。

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

如何正确关闭它?


更新:

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

4

2 回答 2

8

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

于 2014-04-03T10:47:54.603 回答
2

fdopen()由于您给出的原因,我认为两次调用是一个错误。

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

于 2013-09-18T08:01:03.517 回答