Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 两种IPs的比较_C_Linux_Comparison_Ip Address_Kernel Module - Fatal编程技术网

C 两种IPs的比较

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

我需要比较两个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_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");              
}