rarp结构体是什么,我c程序中抓包后怎么提取rarp中的数据
发布网友
发布时间:2022-04-22 15:32
我来回答
共2个回答
热心网友
时间:2023-11-10 22:56
这是正常的。是C/C++编译系统对结构体字节对齐的结果。可以指定选项改变这一结果.
有的C/C++编译系统默认是双字(8字节)对齐,有的C/C++编译系统默认是字(4字节)对齐。意思是,每个结构成员都从某一倍数进行地址分配。比如你的情况:无论是4字节对齐还是8字节对齐,因为char szArray[6]占6个字节,unsigned long nNum 就要空出2个字节,以便从4或8的倍数分配地址。这两个字节的内容就是不确定的。
如果想避免这种情况,应尽可能使用char或unsigned char, 最好定义为4的倍数。也可以根据以下原则:
8字节长的结构成员类型(如double)偏移在8的倍数上,4字节长的结构成员类型(如int)偏移在4的倍数上,2字节成员类型(如short)偏移在2的倍数上,一字节长的成员类型(如char)不限。
如:
typedef struct {
char szArray[6];
short mmy;
unsigned int uNum;
} MYSTRUCT;
如果有些结构不是自己能左右的,如你要用的ARP包,我是这样说明的:
typedef struct ARP {
u_short arpHardType; //Type of hardware address
u_short arpProtoType; //Type of address to map to
u_char arpHardSize; //Size (in bytes) of hardware address
u_char arpProtoSize; //Size (in bytes) of address to map to
u_short arpOpType; //ARP Operation Type (Request/Response) or RARP types
u_char arpSenderMAC[6];//MAC address of packet originator
u_char arpSenderIP[4]; //IP address of packet originator
u_char arpDestMAC[6]; //MAC address of the target host (or broadcast)
u_char arpDestIP[4]; //IP address of target host
} ARP;
中的 arpDestIP, 偏移在24,他本身长4,所以说明成 unsigned int也是没问题的。但是arpSenderIP就偏移在14, 不是4的倍数。如果说明为unsigned int, 他前面就要空出两个字节。作为特定的ARP包就不对了。因此这里把两个IP地址都说明为unsigned char数组。
(上面的说明刚才说颠倒了。现已更正)
如果考虑用u_int编程更方便,也可以说明为u_int.但那样就必须选择以1或2字节对齐。如VC指定编译选项/Zp1或/Zp2; 如果是VC IDE, 可在工程-设置-C/C++, 分类选code generation, 在Struct Member Alignment中有对齐方式。选择1 Byte或2 Bytes.
GCC可以在结构说明中指定,如:
typedef struct {
char szArray[6];
unsigned long __attribute__ ((packed)) nNum;
} MYTYPE;
热心网友
时间:2023-11-10 22:57
我的做法是,shell cmd /c ipconfig /all > ipmac.txt
再 find "mac addr" ipmac.txt
得到还有mac address 的行。
mid(该行, instr(":")) 等等函数。获取之。