如何实现每个数据包格式为的数据包缓冲区:
typedef struct{
int32 IP; //4-byte IP-address
int16 ID; //unique sequence id
}t_Packet;
最合适的数据结构应该是什么:
(1)允许收集至少8000个这样的包(快速插入和删除操作)
(2)允许使用IP地址进行非常快速的过滤,因此只选择具有给定IP的数据包
(3)允许使用ID作为键的非常快速的查找操作
(4)允许非常快(2),然后(3)在过滤结果中?
RAM大小很重要,例如没有大的查找表可以使用。
答案 0 :(得分:4)
您可以使用Patricia Trie进行IP地址过滤。我相信大多数网络路由器都将此数据结构用于IPV4 IP地址。您还可以考虑使用其他针对IP地址设计的文献。这是一个:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.35.4871
对应每个IP地址,您现在可以拥有基于ID的哈希表。
如果IP地址“足够”随机,你可能最好使用散列表来进行基于IP的过滤,因为IP地址非常适合大多数机器的单词,使哈希查找真的很快,特里可能不会为你节省太多空间。
当然,正确的选择取决于你的情况......
答案 1 :(得分:1)
为数据创建两个索引(非顺序存储以便快速插入等),一个是按ID分割的树,另一个是按IP分割的树。
如果您无法承受至少8000 * sizeof(数据包)+ 8000 * 12 + 8000 * 12的数据+两个索引,那么说实话,只迭代8000个项目并不会花费很长时间。
这在c ++中比c更容易实现(如果只是因为你可以使用boost :: multi_index,或者类似的话)