2012-03-19 7 views
0

私はクライアントサーバーアプリケーションで作業しています。私のアプリは可変サイズのパケットを扱っています。各パケットはヘッダと可変長のペイロードを持っています。Recvリングバッファーと単純バッファー

私のジレンマは、recvを実行するときにパケットを渡すための最良の方法です。 私が出会ったチュートリアルのほとんどは、リングバッファの使用を提案していますが、私が知る限り、扱うことができる最大のパケットのサイズの2倍のサイズのバッファを使う方が効率的です。私はリングバッファを使用する場合は

私はrecvのための追加のバッファを必要とし、私は私がリングバッファにバッファを挿入するために1つまたは2つmemcpysを行う必要があることを意味リングバッファにバッファをコピーする必要が

私がシングルバッファアプローチを使用する場合、私は完全なパケットを取得したときにrecvコールとmemmoveコールに渡すことができるバッファを1つだけ必要とし、バッファの先頭にデータを移動します。バッファ。

何か問題がありますか?

PS。可変長パケットが扱われるソースコード/サンプルを参考にすれば助かります。

+0

は、このTCPまたはUDPですか? –

+0

@KarolyHorvathそれはTCPです –

+1

なぜ落選ですか? –

答えて

1

私はリングバッファを使用している場合、私はrecvのための追加のバッファを必要とし、私は私がリングバッファにバッファを挿入するために1つまたは2つmemcpysを行う必要があることを意味するリングバッファでバッファをコピーする必要が

ええと、読み込みと書き込みが2回あり、大したことはありません(*)。しかし、追加のバッファは必要ありません。読み込みのために、リングバッファの終わりまで左のスペースに読み込みを最大化してください。

(*):追加のシステムコールのコストが不安な場合は、スキャッタ/ギャザーの読み取り/書き込みにはrecvmsgsendmsgがあります。

+0

はい私はlen = ringバッファの空きスペースでrecvを呼び出すことができましたが、長さパラメータ –

+0

see(*)の非常に小さい値でrecvを呼び出すことができました。それはおそらく問題ではありません。この種の最適化は、非常に高性能のサーバーでのみ重要です。 –

+0

あなたは正しいです。しかし、私はまだ単純なバッファ上でリングバッファを使用する利点は何かを理解していません –