2

私はクライアントサーバーアプリに取り組んでいます。私のアプリは可変サイズのパケットで動作しており、各パケットには可変長のヘッダーとペイロードがあります。

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

リング バッファーを使用する場合、recv 用に追加のバッファーが必要であり、リング バッファーにバッファーをコピーする必要があります。つまり、リング バッファーにバッファーを挿入するには、1 つまたは 2 つの memcpys を実行する必要があります。

シングル バッファ アプローチを使用する場合、recv 呼び出しに渡すことができるバッファが 1 つだけ必要であり、フル パケットを取得したときにデータをバッファの先頭に移動するための memmove 呼び出しが必要であり、バッファ内に別のパケットに属するデータがまだ存在します。 .

私は何か間違っていますか?

PS。可変長パケットが処理されるソースコード/例を教えていただければ助かります。

4

1 に答える 1

1

リングバッファを使用する場合、recv用に追加のバッファが必要です。次に、バッファをリングバッファにコピーする必要があります。つまり、バッファをリングバッファに挿入するには、1つまたは2つのmemcpyを実行する必要があります。

ええ、2回の読み取りと書き込み、大したことはありません(*)。ただし、追加のバッファーは必要ありません。読み取りの場合は、リングバッファの最後まで残っているスペースへの読み取りを最大化します。

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

于 2012-03-19T17:35:14.277 に答える