C 两种IPs的比较
我需要比较两个IP。一个IP以C 两种IPs的比较,c,linux,comparison,ip-address,kernel-module,C,Linux,Comparison,Ip Address,Kernel Module,我需要比较两个IP。一个IP以u8格式存储,我设法将其转换为char*,并存储在变量arp\u tbuf中。但是,要比较的第二个IP是u32格式(来自IP.h)。但每次我尝试将u32格式的IP转换为char*时,如下所示 unsigned int pkt_da = (unsigned int)ip_header->daddr; char pkt_tbuf[16]; char pkt_tbuf_tmp[4]; pkt_tbuf_tmp[0] = pkt
u8
格式存储,我设法将其转换为char*
,并存储在变量arp\u tbuf
中。但是,要比较的第二个IP是u32
格式(来自IP.h
)。但每次我尝试将u32
格式的IP转换为char*
时,如下所示
unsigned int pkt_da = (unsigned int)ip_header->daddr;
char pkt_tbuf[16];
char pkt_tbuf_tmp[4];
pkt_tbuf_tmp[0] = pkt_da & 0x000000FF;
pkt_tbuf_tmp[1] = (pkt_da & 0x0000FF00) >> 8;
pkt_tbuf_tmp[2] = (pkt_da & 0x00FF0000) >> 16;
pkt_tbuf_tmp[3] = (pkt_da & 0xFF000000) >> 24;
sprintf(pkt_tbuf, "%d.%d.%d.%d\n", pkt_tbuf_tmp[0], pkt_tbuf_tmp[1], pkt_tbuf_tmp[2], pkt_tbuf_tmp[3]);
我得到一个内核死机
错误
我知道与字符比较的功能memcmp
如果您的专家能帮助我将此IP转换为char*
和以比较这两个IP如memcmp(arp\u tbuf,pkt\u tbuf)
,那将是一个很大的帮助
非常感谢:)
编辑
正如@BobJarvis所建议的,我在内核中再次运行了代码。它可以很好地转换局域网中的IP。但是,当我加载web页面时,出现了
内核死机
错误。我有一种更干净的方法来执行从无符号int
到字符*
(点式IP格式)的IP转换。我相信您遇到了值(IP的任何2字节部分)超过127的问题。>
运算符是一个算术移位(保留符号)移位,而不是逻辑移位。(见附件)。通过对pkt_da=0x7f7f7f
和pkt_da=0x808080
的简单测试,您可以在代码中看到这一点。使用以下命令打印值:
for (it = 0; it < 4; it++)
printf (" pkt_tbuf_tmp[%2d]: %u\n", it, pkt_tbuf_tmp[it]);
右移行为依赖于编译器。因此,在一个盒子上工作的东西可能在另一个系统上不起作用。根据@DavidC.Rankin给出的解释,我能够缩小范围,寻找更多的解决方案。因此,我找到了一个类似的帖子,它解决了将int-IP转换为点IP的问题, 然后我刚刚执行了一个
memcmp()
int-cmp;
cmp=memcmp(arp_tbuf,pkt_tbuf,sizeof(arp_tbuf));
如果((cmp>0)| |(cmp<0)){
printk(KERN_警报“不匹配”);
}
感谢专家们帮助我理解这个问题。:) @BobJarvis ohh错误..我将更正问题:)现在,你所说的“u8格式”是什么意思?请出示申报单。谢谢。@JimGarrison哦,我会尽快检查的。完全错过了。非常感谢:)我刚刚在测试了您的代码,它编译后运行良好。(注意,我使用了一个文本作为IP地址)。您的代码中一定有其他东西导致内核死机。试着用我在Ideone测试的代码,在你的网站上编译并运行,看看你得到了什么。谢谢,“发生在”之后并不意味着“发生在”之内。16个字符不足以包含4个3字符的四元组、3个点、一个换行符和终止的空字符。只是说。非常感谢你的回复。我会查收邮件:)是的,你完全正确。先生,你有什么解决办法?所以它可以支持所有的ip值?我很高兴你找到了一个解决方案。这是我一直在想的。请看一下
inet\u pton
函数。是的,先生,您的建议帮助我找到了解决问题的具体方法。。非常感谢你
./bin/pktb 2139062143
pkt_tbuf_tmp[ 0]: 127
pkt_tbuf_tmp[ 1]: 127
pkt_tbuf_tmp[ 2]: 127
pkt_tbuf_tmp[ 3]: 127
Done - pkt_tbuf='127.127.127.127'
./bin/pktb 2155905152
pkt_tbuf_tmp[ 0]: 4294967168
pkt_tbuf_tmp[ 1]: 4294967168
pkt_tbuf_tmp[ 2]: 4294967168
pkt_tbuf_tmp[ 3]: 4294967168
Done - pkt_tbuf='-128.-128.-128.-128'
int cmp;
cmp=memcmp ( arp_tbuf, pkt_tbuf, sizeof(arp_tbuf) );
if((cmp > 0) || (cmp < 0)){
printk(KERN_ALERT "Not matching");
}