Linux C - Преобразовать `iphdr-> daddr` в эквивалентную строку - больше не работает? - PullRequest
2 голосов
/ 06 марта 2020

Существует несколько потоков о том, как преобразовать ip-адреса в struct iphdr в строки (например, 127.0.0.1) одним и тем же методом, например:

Преобразование исходного IP-адреса из структуры iphdr * в строковый эквивалент, используя Linux netfilter

Но почему-то они не работают для меня:

char daddr_str[16];

struct iphdr *iph = (struct iphdr*)(buf);

snprintf(daddr_str, sizeof(daddr_str), "%pI4", &iph->daddr);
printf("IP: %s\n", daddr_str);

И я получаю:

IP: 0x7f5870621020I

Есть идеи, что я сделал не так?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Одной из проблем может быть то, что вы неправильно извлекаете IP-заголовок из пакета. В начале буфера обычно находится заголовок Ethe rnet, а затем IP-заголовок, поэтому для получения IP-заголовка необходимо:

struct iphdr *iph = (struct iphdr*)(buf + sizeof(struct ethhdr));

Надеюсь, это помогло в вашем случае Вот также хороший гид

Редактировать

Вы правы, это не было реальной проблемой в вашем случае. Я попробовал это сам и также получил только адрес.

После некоторых исследований я думаю, что настоящая причина в том, что эти строки специального формата, такие как %pI4, известны только в реализации этих функций ядром, а не реализацией stdlib. Так что эта попытка будет работать только при разработке модуля ядра, например

0 голосов
/ 06 марта 2020

Я сейчас сделал это наоборот:

struct sockaddr_in ip;

inet_aton("127.0.0.1", &ip.sin_addr);

if(ip.sin_addr.s_addr == iph->daddr) {
    ...
}
...