inet_ntoa
возвращает указатель на строку, созданную в статической памяти, которая является внутренней по отношению к inet_ntoa
. Он повторно использует ту же самую статическую память каждый раз, когда она вызывается. Когда вы делаете это:
dev_ip = inet_ntoa(...);
dev_ip
устанавливается для указания на этот внутренний статический буфер. В этот момент статический буфер содержит строку, представляющую адрес интерфейса, поэтому ваш:
printf("IPv4 address: %s\n", dev_ip);
показывает ожидаемый результат. Но затем вы делаете это:
printf("inet_ntoa: %s\n",inet_ntoa(ip->ip_src));
и перезаписывает внутренний буфер inet_ntoa
строкой, представляющей адрес пакета.
Но помните, что dev_ip
все еще указывает на этот внутренний буфер. Поэтому, когда вы делаете это:
if (strcmp(dev_ip,inet_ntoa(ip->ip_src)) == 0)
(что, кстати, излишне перезаписывает внутренний буфер с адресом пакета, который уже был там), два аргумента, которые передаются в strcmp
, оба являются указателями на inet_nota
внутренний буфер, и поэтому strcmp
всегда обнаружит, что целевые строки совпадают - потому что оба аргумента указывают на одну и ту же строку.
Чтобы исправить, либо сделайте локальную копию строки, сгенерированнойinet_ntoa
сразу после вызова, путем копирования в локальный буфер или выполнения чего-то вроде:
dev_ip = strdup(inet_ntoa(...));
(и не забывайте free(dev_ip)
, когда вам больше не нужна эта строка) или, что еще лучше,используйте потокобезопасный вариант inet_ntoa
, называемый inet_ntoa_r
, если ваша платформа имеет эту функцию. inet_ntoa_r
не использует (и повторно использует) внутренний буфер. Требуется, чтобы вызывающий указывал буфер, в который будет помещена строка.