4

私はソケットを持っていますsock:

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

そして、 、 、stdioなどでバッファリングされたリーダーとライターを使用できるように、fdopen で 2 回開きました。fwritefreadfgetsfprintf

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

// some IO here.

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

しかし、私たちが知っているように、もし私がファイルなら、続いfcloseて aが呼び出され、失敗します。closefclose

また、 のみを使用するcloseと、構造体のメモリFILEがリークされます。

どうすれば正しく閉じることができますか?


アップデート:

fdopen一度使うと"r+"読み込みと書き込みが同じロックを共有しますが、送信と受信を除いて個別に動作します。

4

2 に答える 2

2

fdopen()あなたが与えた理由から、2回電話するのは間違いだと思います。

で一度開きfdopen()、モード文字列を渡し"r+b"て読み取り/書き込みおよびバイナリにします。

于 2013-09-18T08:01:03.517 に答える