C 从<;获取IPHDR结构时出现问题;netinet/ip.h>;

C 从<;获取IPHDR结构时出现问题;netinet/ip.h>;,c,ip,packet-sniffers,C,Ip,Packet Sniffers,我目前正在尝试学习如何解析项目的数据包。 目前,我已经能够将以太网报头中的数据放入netinit提供的结构中: struct ether\u header*eth\u header=(struct ether\u header*)数据 这很好,我能够从每个属性获取数据 但当我为IP头创建结构并尝试获取长度时: unsigned int ipheader_length = ip_header->ihl; printf("The header length for IP i

我目前正在尝试学习如何解析项目的数据包。 目前,我已经能够将以太网报头中的数据放入netinit提供的结构中:

struct ether\u header*eth\u header=(struct ether\u header*)数据

这很好,我能够从每个属性获取数据

但当我为IP头创建结构并尝试获取长度时:

  unsigned int ipheader_length = ip_header->ihl;

  printf("The header length for IP is %d: \n", ipheader_length); 
它似乎无法识别iphdr结构,我实际上无法访问任何字段

我包括了图书馆:
#包括

但是仍然没有机会访问结构来解析头中的属性

有谁能帮我了解出了什么问题吗


我有一个嗅探函数,它嗅探数据包,然后我将数据包开始的指针发送到一个名为dump的函数中,在这里我定义了eth_头和ip头(我使用了struct
iphdr*ip_头=(struct iphdr*)data+eth_HLEN;

您的
ip_头
计算存在运算符优先级问题。
数据的转换将在添加之前进行,结果是您将从错误的内存位置读取标题

解决方法很简单,添加一些括号:

iphdr*ip_头=(结构iphdr*)(数据+ETH_-HLEN);

ip\U头在哪里定义?需要一行,而不是三行脱离上下文的代码。@Shawn My bad,我不小心漏掉了定义标题的那行。我有一个嗅探函数,它嗅探数据包,然后我将数据包开始的指针发送到一个名为dump的函数中,在这里我定义了eth_头和ip头(我使用了行
struct iphdr*ip_头=(struct iphdr*)data+eth_-HLEN;
)(例如,你对第一条评论的一些回应)写进你原来的帖子中。同时也注意到这条告诫,要包含足够多的信息,以便那些能够提供帮助的人能够真正提供帮助。