具有boost :: circular_buffer类型值的STL映射容器

时间:2013-02-27 19:23:46

标签: c++ boost stl buffer pcap

简介

我正在编写一个应用程序,需要能够跟踪网络流量的谨慎配置文件的吞吐量(当然,使用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回调逐个数据包更新。

问题

以这种方式做到这一点是疯狂/不明智/不可能吗?我担心它可能不足以跟上数据包捕获的速度。我需要注意哪些复制语义?我认为它应该是合适的,只要我没有导致循环缓冲区在每次更新时都被复制。我问,因为我不确定我是否完全掌握了所有的含义。

0 个答案:

没有答案