Одинаковый адрес отправителя и получателя IP-пакета

У меня есть программа пространства пользователя, в которой я обрабатываю пакеты. Я отправляю их туда с помощью iptables.

Но у меня есть проблема, чтобы правильно определить источник и назначение пакета. Пункт назначения должен быть 192.168.1.66, а источник - 192.168.0.102. Но странная вещь, если я напишу:

char *dstIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_dst);    
char *srcIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_src);

Я получаю и пункт назначения, и источник 192.168.1.66.
Но если я напишу:

char *srcIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_src);
char *dstIpAddress = inet_ntoa(((struct ip*)full_packet)->ip_dst);    

Я получаю и пункт назначения, и источник 192.168.0.102.

В чем проблема?

1 ответ

Решение

Как прокомментировал капитан Облиус, inet_ntoa возвращает статически выделенный буфер. Из inet_ntoa (3):

Функция inet_ntoa() преобразует адрес хоста в Интернете, заданный в порядке сетевых байтов, в строку в десятичном формате с точками IPv4. Строка возвращается в статически выделенном буфере, который последующие вызовы будут перезаписывать.

Скопируйте возвращенное значение или используйте inet_ntop который использует выделенный пользователем буфер.

Другие вопросы по тегам