2

我正在按照此链接上的教程创建原始套接字数据包嗅探器:

http://www.security-freak.net/raw-sockets/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)上,我只能在 arpa/inet.h 中找到 inet_ntoa() 函数,但本教程甚至没有使用该标题。当我包含 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));
4

2 回答 2

9

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)));

请注意,如果您需要保留字符串以供以后使用,则应使用单独的缓冲区。

于 2011-09-12T08:52:06.437 回答
0

它应该可以在大多数 Linux 发行版(x86 和 x64 版本)下工作,其中包括:

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

但是,如果所有这些都是强制性的,则不确定 100%。

于 2013-05-04T14:20:53.250 回答