C++ 将目标地址与C++;
基本上,我有两个4字节的IP地址:C++ 将目标地址与C++;,c++,network-programming,ip-address,forwarding,C++,Network Programming,Ip Address,Forwarding,基本上,我有两个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匹配。
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头中
编辑:我找到了“最长”的匹配项。因此,我不是比较条目来检查它们是否相等,而是比较它们来确定有多少位是相同的。当所有的位都相同时,最好的匹配是显而易见的。类似于
daddr&(0xffffffff,只比较一些无符号类型UInt
的a
和b
的顶部n
位:
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))) { /*...*/ }
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