gpt4 book ai didi

c - 数据对齐与网络编程

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:58 24 4
gpt4 key购买 nike

我对数据对齐有点困惑。在 x86 上,我们通常认为对齐是理所当然的。但是,我在一个非常严格的系统上编程,如果我尝试访问未对齐的数据,将会出错。

这是我的问题:

首先,我将向您展示我拥有的一些结构:

struct sniff_ethernet {
u_char ether_dhost[6]; /* Destination host address */
u_char ether_shost[6]; /* Source host address */
u_short ether_type; /* IP? ARP? RARP? etc */
};

struct sniff_ip {
u_char ip_vhl; /* version << 4 | header length >> 2 */
u_char ip_tos; /* type of service */
u_short ip_len; /* total length */
u_short ip_id; /* identification */
u_short ip_off; /* fragment offset field */
u_char ip_ttl; /* time to live */
u_char ip_p; /* protocol */
u_short ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
};

我正在处理 pcap。 Pcap 会返回一个指向数据包的指针给我:

u_char *packet;

假设数据包有几百个字节。我通常做的是将该数据包转换为多个结构指针,这样我就可以直接访问数据。

struct sniff_ethernet *seth = (struct sniff_ethernet *) packet;
struct sniff_ip *sip = (struct sniff_ip *) (packet + 14); // 14 is the size of an ethernet header

好的。所以一切看起来都不错吧?在 x86 上,一切似乎都正常工作。在具有严格对齐的任何其他架构上,我在访问某些值时遇到问题并且通常会导致 sigbus。例如:

sip->ip_len = 0x32AA;

u_short val = sip->ip_len;

导致错误。我猜是因为它在 Actor 的内存中错位了。在进行此类转换时,通常最好的处理方法是什么?

最佳答案

最简单的方法是使用memcpy

struct sniff_ip sip;
memcpy(&sip, packet + 14, sizeof(sip));

这假设您的两台机器使用相同的字节顺序,并且已经仔细考虑了结构填充。

处理这个问题的更难和更通用的方法是从单个字节构造值:

u_short val;
int offset = 14 + offsetof(sniff_ip, ip_len);
val = packet[offset] + (packet[offset+1] << 8); // assuming little endian packet

当然,您可能会使用函数或宏来对此进行抽象。

关于c - 数据对齐与网络编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3848388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com