RnM*_*Mss 4 c c++ sockets posix glibc
我有一个插座sock:
int sock = socket(...);
connect(sock, ...);
// or sock = accept(sock_listen, 0, 0);
Run Code Online (Sandbox Code Playgroud)
并且我用 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);
Run Code Online (Sandbox Code Playgroud)
但是我们知道,如果我fclose是一个文件,aclose将随后被调用,并且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);
Run Code Online (Sandbox Code Playgroud)
编辑:您当然可以将其与仅使用单个 FILE 对象进行读取和写入结合起来。
| 归档时间: |
|
| 查看次数: |
4875 次 |
| 最近记录: |