【问题标题】:Matching destination address to forwarding table entry in C++将目标地址与 C++ 中的转发表条目匹配
【发布时间】:2023-04-10 15:28:01
【问题描述】:

基本上,我有两个 4 字节的 IP 地址:

u_int32_t daddr; // in the packet
u_int32_t entry; // in the forwarding table

我还有一个前缀,与转发表中的条目一起使用:

unsigned short prefix; // in forwarding table corresponding to entry

我需要根据前缀将 daddr 与条目匹配。我很确定这意味着什么:如果前缀是 23,那么我必须将条目的前 23 位与 daddr 匹配。老实说,我什至不知道从哪里开始,因为我不知道如何匹配各个位。

我有一个转发表,其中包含许多条目,每个条目都有不同的前缀。我不确定如何将 da 与正确的条目相匹配。任何帮助将不胜感激。 我的 daddr 存储在我从 netinet ip.h 文件中获得的标准 ip 标头中。

编辑:我找到了“最长”的匹配。所以我不是比较条目来只检查它们是否相等,而是比较它们以确定有多少位相同。最好的匹配显然是所有位都相同。

【问题讨论】:

    标签: c++ network-programming ip-address forwarding


    【解决方案1】:

    仅比较某些无符号类型ab 的顶部nUInt

    const unsigned int NBITS = sizeof(UInt) * CHAR_BIT;
    
    UInt a, b;
    
    if ((a >> (NBITS - n)) == (b >> (NBITS - n))) { /*...*/ }
    

    比较底部m位:

    if ((a << (NBITS - m)) == (b << (NBITS - m))) { /*...*/ }
    

    一些解释:UInt 类型有sizeof(UInt) 字节,因此有NBITS 位。为了比较顶部的n 位,我们只需将两个数字都向右移动,这样就只剩下n 位(新的顶部位用零填充,因为类型是无符号的)。为了比较底部的m 位,我们将两个数字都向左移动,直到除了m 之外的所有位都从左边掉下来(并且在右边填充了零):

    NBITS = 12, n = 4, m = 7:
    
         a:  1 2 3 4 x A B C D E F G
         b:  1 3 2 5 x A B C D E F G
    
    a >> 8:  0 0 0 0 0 0 0 0 1 2 3 4
    b >> 8:  0 0 0 0 0 0 0 0 1 3 2 5
    
    a << 5:  A B C D E F G 0 0 0 0 0
    b << 5:  A B C D E F G 0 0 0 0 0
    

    【讨论】:

      【解决方案2】:

      也许是daddr&amp;(0xffffffff&lt;&lt;(32-prefix)) == entry

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-23
        • 2014-04-18
        • 2018-10-03
        • 1970-01-01
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        相关资源
        最近更新 更多