2013-02-04 13 views
7

ソケットの設定後、ソケット記述子で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

私はソケットを使用してコードを参照してくださいしかし、通常は、ソケット記述子ではなく、すべての操作のためのストリームの使用されています。下位レベルの機能を使用する利点はありますか?

+3

Cファイルストリームはデフォルトでバッファリングされているので、送信するときには自分でフラッシュすることを忘れないように注意してください。また、ソケットを非ブロックにしても読み込みがブロックされることがあります。 –

+0

ラップされたI/Oでのパフォーマンスが十分で、コードを単純なままにしておけば、そのまま使用してください。 – paddy

+1

私の意見では、read()とwrite()はエラー状態をより直接的に処理します。 – thuovila

答えて

3

さらに詳しい制御とエラー処理が必要な場合は、readwriteを使用してください。あなたがしない場合、stdio関数の利便性を好む場合は、FILE*ラッパーを使用してください。

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

高性能インターネットアプリケーションであればreadwriteを直接使用することをおすすめします。

+0

'recv'と' send'は、 'MSG_NOSIGNAL'のようなフラグを指定することができるので、さらに正確な制御が可能です。 –