Использование ntop () вместо ntoa () в старом учебнике по необработанным сокетам - PullRequest
2 голосов
/ 12 сентября 2011

По этой ссылке я следую учебному пособию для создания необработанного анализатора пакетов сокетов:

http://www.security -freak.net / сырье Розетки / sniffer_eth_ip.c

Код использует функцию ntoa (), чтобы получить точечную версию IP-адресов источника / назначения, но, насколько я понимаю, эта функция устарела, и поэтому эти строки вызывают проблемы.

ip_header = (struct iphdr*)(packet + sizeof(struct ethhdr));

/* print the Source and Destination IP address */

printf("Dest IP address: %d\n", inet_ntoa(ip_header->daddr));
printf("Source IP address: %d\n", inet_ntoa(ip_header->saddr));
printf("TTL = %d\n", ip_header->ttl);   

В моей системе (Ubuntu 11.04) я мог найти только функцию inet_ntoa () в arpa / inet.h, но учебник даже не использует этот заголовок. Когда я включил arpa / inet.h, я получаю эту ошибку компиляции:

sniffer.c:154:4: error: incompatible type for argument 1 of ‘inet_ntoa’
/usr/include/arpa/inet.h:54:14: note: expected ‘struct in_addr’ but argument is of type     ‘__be32’

Так что я понимаю, что мне нужно использовать struct in_addr, но я не знаком с этим типом '__be32'. Кто-нибудь может помочь?

РЕДАКТИРОВАТЬ - На самом деле это работает, выполняя довольно сложное приведение, но есть ли лучший способ?

printf("Dest IP address: %s\n", inet_ntoa(*(struct in_addr*)&ip_header->daddr));
printf("Source IP address: %s\n", inet_ntoa(*(struct in_addr*)&ip_header->saddr));

Ответы [ 2 ]

8 голосов
/ 12 сентября 2011

inet_ntoa официально не рекомендуется, но немного устаревший стиль, поскольку использует статический буфер. Обычно я рекомендую использовать getnameinfo для преобразования по двоичному адресу в точечный символ, но в этом случае inet_ntop будет работать лучше:

char ipbuf[INET_ADDRSTRLEN];
printf("Dest IP address: %s\n", inet_ntop(AF_INET, &ip_header->daddr, ipbuf, sizeof(ipbuf)));
printf("Source IP address: %s\n", inet_ntop(AF_INET, &ip_header->saddr, ipbuf, sizeof(ipbuf)));

Обратите внимание, что вы должны использовать отдельные буферы, если вам нужно сохранить строки на потом.

0 голосов
/ 04 мая 2013

Он должен работать в большинстве дистрибутивов Linux (как для x86, так и для x64), включая следующие:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

Не уверен 100%, если все они обязательны.

...