したがって、基本的に、マルチキャスト環境からいくつかのパケットをキャプチャする機能があり、それらをファイルに保存してから、マルチキャスト データを期待するアプリケーションにマルチキャストします。シミュレーション目的でこれを行います。これは比較的単純なツールであり、gdb で実行されているアプリケーションに対して 10 または 50K のパケットを再生する場合に役立ちました。私の再生ループは次のようになります。
for (size_t i = 0; i < packets_.size(); ++i)
publisher_.publish(packets_[i].buf_, packets_[i].len_);
問題は、packets_.size() が約 100 ~ 200K の場合 (それ以上の処理を行う必要はありません)、誰かがリッスンしているときにパケット損失が発生しているように見えることです。これは、それらが 1 つの連続したバーストで再生されるためだと推測しています。次のようなことを試した場合:
for (size_t i = 0; i < packets_.size(); ++i)
{
if (i % Y == 0) usleep(X);
publisher_.publish(packets_[i].buf_, packets_[i].len_);
}
Y
と(1000/1000 や他の多くのコンボのように)のさまざまな量に対してですX
が、これはうまく機能しません。私の推測では、非常に短い時間、すべての反復で噛み砕くサイクルをビジーにすることができれば、これにパッチを当てることができるということでした。ビジーチューは、他のプロセスに譲りたくないため、予想よりも時間がかかりますが、パケットをマルチキャストするのに 200 秒待機する必要があるため、ミリ秒ではなく非常に少量です。ループ内でスリープ関数を繰り返し呼び出すと、結果が得られず、速度が大幅に低下するようです。
または、このユースケースでこれにパッチを適用するためのより良い簡単な方法があるとしたら?