По этой ссылке я следую учебному пособию для создания необработанного анализатора пакетов сокетов:
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));