Одинаковый адрес отправителя и получателя 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
который использует выделенный пользователем буфер.