我试图比较这两个char指针中的值,但我得到了奇怪的输出:
第一个是(libpcap IP地址):
const char* ip_source = inet_ntop(AF_INET, &ip->ip_src, buffer1, sizeof(buffer1)); //192.168.56.1
第二个是:
char *host_ip = inet_ntoa(((struct sockaddr_in*)a->addr)->sin_addr); //192.168.56.1
我已尝试使用if (*ip_source == *host_ip)
,if (strcmp(ip_source, host_ip) == 0)
和if (strncmp(ip_source, host_ip, strlen(host_ip))
。
如何比较这两个变量中存储的IP地址,看看两个IP地址是否相同?
这是代码:
if (strncmp(ip_source, host_ip, strlen(host_ip)) == 0) // if sent local > remote
{
printf(" RST/ACK Detected [Local > Remote]\n");
}
else // if sent remote > local
{
printf(" RST/ACK Detected [Remote > Local]\n");
}
结果如下:
Packet number 2386:
current time: 2015-04-11 15:07:59.412
From(src): 192.168.56.1 <---- Local (IP stored in *host_ip)
To(dst): 192.168.56.2 <---- Remote
Protocol: TCP
Src port: 1864
Dst port: 49750
Seq Num: 0
Ack Num: 3556812524
RST/ACK Detected [Remote > Local] <--- Wrong
在这种情况下,它会返回-2
答案 0 :(得分:0)
第一个只是比较每个的第一个字符,而strcmp 看起来对我来说。如果一个是常数而另一个不是,则无所谓。
答案 1 :(得分:0)
事实证明问题出在inet_ntoa而不是字符串测试。
变量host_ip
被捕获的每个数据包覆盖。
当我获得IP地址时,我使用了这个:
inet_ntoa(((struct sockaddr_in*)a->addr)->sin_addr);
但每次捕获数据包时都会动态覆盖,因此将其更改为静态:
const char* host_ip = inet_ntop(AF_INET, &(((struct sockaddr_in*)a->addr)->sin_addr), buffer1, sizeof(buffer1));
方法有效。
答案 2 :(得分:0)
为什么不直接比较地址,因为它们都是网络字节顺序?
if (memcmp(&ip->ip_src, &((struct sockaddr_in*)a->addr)->sin_addr.s_addr, 4) == 0) {
printf(" RST/ACK Detected [Local > Remote]\n");
} else {
printf(" RST/ACK Detected [Remote > Local]\n");
}