11

ソケットがセットアップされた後、ソケット記述子で read(2) および write(2) 呼び出しを使用するか、fdopen(3) を使用してストリームをソケット記述子に関連付けてから stdio(3) 関数を使用する方がよい方法ですか? ?

int sfd = socket(PF_INET, SOCK_STREAM, 0);
// setup the socket using sfd
FILE * stream = fdopen(sfd, "r+");
// use fprintf, fscanf, etc

編集:ストリームのバッファリングも解除します

setbuf(stream, NULL)

コメントに記載されているように、フラッシュする必要がないようにします。

FILE* ストリーム用に記述されたコードを再利用できるため、私はこのアプローチを使用してきました。また、フォーマット文字列を使用できるという利点があります (私は人間が読めるテキストを扱っています)。GNU は、これが良い考えであると示唆しているようです。

http://www.gnu.org/software/libc/manual/html_node/Streams-and-File-Descriptors.html

ただし、通常、ソケットを使用するコードを見ると、すべての操作でストリームの代わりにソケット記述子が使用されます。低レベル関数を使用する利点はありますか?

4

1 に答える 1

5

エラー状態をより正確に制御および処理する必要がある場合は、 および を使用readwriteます。そうでなく、標準入出力関数の利便性を好む場合は、FILE*ラッパーを使用してください。

ラッパーを使用する際の問題の 1 つFILE *は、データが実際にソケットに書き込まれる方法とタイミングを制御できないことです。これは、注意しないと、非効率的なネットワーク利用と過度の遅延 (Nagle のアルゴリズムが遅延 ACK と相互作用するため) につながる可能性があります。

これが高パフォーマンスのインターネット アプリケーションである場合は、readand を直接使用することをお勧めします。write

于 2013-02-04T11:42:07.057 に答える