序章
私は、ネットワーク トラフィックの目立たないプロファイルのスループットを追跡する機能を必要とするアプリを作成しています (もちろん、libpcap を使用します)。基本的な考え方は、定期的なサンプル間隔ごとにバイト カウンターとパケット カウンターを蓄積し、それを使用して約 1 秒間隔で平均スループットを計算することです。
詳細
各データ ポイントは、リモート アドレスとリモート ポートの両方によって区別されます。次の構造で構成される循環バッファに (非常に短い) サンプル履歴を保存します。
typedef struct {
struct timeval ts_start; // Time at the start of this sample
size_t packets; // packet count during this sample
size_t bytes; // byte count during this sample
} Sample;
私の最初の考えは、次のようなSTLとBoostで何かをすることです:
typedef std::pair<unsigned long /* addr */, unsigned short /* port */> PeerSpec;
typedef boost::circular_buffer<Sample> DataPoint;
std::map<PeerSpec, DataPoint> tracked_peers;
各循環バッファーには少数の要素があり、その数は として定義され1 + summary_interval / sample_period
ます。要約間隔が 1 秒の場合、250 ~ 1000 ミリ秒のサンプル期間が適切であると考えていました (データ ポイントごとに 2 ~ 5 サンプルの履歴を意味します)。
このようなトラフィックがキャプチャで観察されると、各データ ポイントがインスタンス化され、tracked_peers
マップに動的に追加されます。当然、カウンターはパケットごとに pcap コールバックによって更新されます。
質問
この方法でこれを行うのはクレイジー/賢明でない/不可能ですか? パケットキャプチャに追いつくのに十分な速度ではないのではないかと心配しています. 注意が必要なコピー セマンティクスはありますか? 更新のたびに循環バッファー全体がコピーされない限り、それは適切であると思います。すべての意味を完全に把握しているかどうかわからないため、質問しています。