比较Const char *和char *

时间:2015-04-11 13:51:56

标签: c network-programming libpcap

我试图比较这两个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

3 个答案:

答案 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");
}