2015-04-11 4 views
0

Я пытаюсь сравнить значения в этих двух символьных указателей, но я получаю странные выходы:Сравнить Const символ * и символ *

Первый (IP-адрес): Libpcap

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

Похоже, что он не прошел тест, но он зависит от входящих сетевых данных, я пытаюсь выяснить, есть ли проблема с этим тестом 'if', базой данных или данными. – Crizly

+0

@ValentinLorentz добавил к вопросу – Crizly

ответ

0

THS первый просто сравнить первый символ каждого, в то время как strcmp выглядит право мне. Не имеет значения, является ли он const, а другой нет.

+0

Я попытался использовать strncmp (ip_source, host_ip, strlen (host_ip), чтобы сравнить все символы, но он все еще не работает – Crizly

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)); 

метод работал.

+0

Это проблема с 'inet_ntoa()', а не libpcap. На странице man в OS X говорится: «Возвращенная строка inet_ntoa() находится в области статической памяти. ", что верно и для других ОС, а это означает, что если * любой * другой код вызывает' inet_ntoa() ', он перезаписывает предыдущее значение. –

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"); 
} 
Смежные вопросы