优快云草稿出问题了。读到别人的草稿了。

本文探讨了在使用WinPcap抓取ARP数据包时遇到的问题:IP地址输出不完整。通过调整结构体中IP地址字段的位置解决了该问题,并解释了这与编译器的字节对齐机制有关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用WinPcap抓取ARP数据包,其中定义ARP数据包结构体如下:
typedef struct ArpPacket
{
u_int16_t macaddrtype;
u_int16_t proaddrtype;
u_int8_t macaddrlen;
u_int8_t proaddrlen;
u_int16_t operationtype;
u_int8_t srcmac[6];
struct in_addr srcip;// u_int8_t srcip[4];定义为字符数组能正确输出
u_int8_t dstmac[6];
struct in_addr dstip;//u_int8_t dstip[4];
}AP;

在源程序中读取协议字段内容:

......
p=parp->srcmac;
printf("源MAC:%02x:%02x:%02x:%02x:%02x:%02x/n",p[0],p[1],p[2],p[3],p[4],p[5]);
p=parp->dstmac;
printf("源ip:%s/n",inet_ntoa(parp->srcip));// 出错
printf("目的MAC:%02x:%02x:%02x:%02x:%02x:%02x/n",p[0],p[1],p[2],p[3],p[4],p[5]);
printf("目的ip:%s/n",inet_ntoa(parp->dstip));//出错

结果:源MAC地址能正确输出,但输出源IP地址时,跳过2个字节,输出后面4个字节内容;后

面目的MAC地址输出往后6个字节,输出目的IP时,又跳过2个字节,输出后面4个字节!

但当把源IP定义为"u_int8_t srcip[4];"时就能正确输出;

然而,IP数据包首部最后两个字段为源IP和目的IP,都定义为struct in_addr类型,可以正确

输出IP地址;我将ARP数据包的两个IP地址字段移到ARP数据包结构体最后2个字段,也能正确

输出!

我现在的想法是:struct in_addr类型字段不能放在结构体中间,放在最后可以,但不知道具

体原因。

PS:

2010-08-09 补充

这是由于定义结构体时,字节对齐问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值