gpt4 book ai didi

c - 接收到的网络数据包中的内存对齐问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:11:52 29 4
gpt4 key购买 nike

我正在 linux 内核中编写自定义协议(protocol)。我正在使用以下结构

struct syn {
__be32 id;
__be64 cookie;
};

struct ack {
__be32 id; // Right now, setting it to 14 (Just a random choice)
__be32 sequence;
};

struct hdr {
............
__be32 type; //last element
};

当我发送和接收数据包时,我映射结构 synack (对于不同的数据包)到 hdr->type 的地址。

理想情况下,这应该意味着 id(在 syn 和 ack 结构中)应该映射到 hdr->type以及 struct hdr 之后的内容应映射到 syn->cookieack->sequence ,取决于我映射到 hdr->type 的结构.

但是在打印出这些变量的内存地址时,我得到以下信息

//For struct syn
hdr->type at ffff880059f55444
syn->id at ffff880059f55444
syn->cookie at ffff880059f5544c //See the last two bits

//For struct ack_frame
hdr->type at ffff880059f55044
ack->id at ffff880059f55044
ack->sequence at ffff880059f55048 //See the last two bits

那为什么要syn->cookieack->sequence从相对于 hdr->type 的不同偏移量开始什么时候ack->idsyn->id大小一样吗?

编辑 1: 我使用

映射这些结构
char *ptr = (char *)&hdr->type;
//For syn
struct syn *syn1 = (struct syn *)ptr
//For ack
struct ack *ack1 = (struct ack *)ptr

最佳答案

由于您使用 64 位工作,因此编译器会填充以下结构:

struct syn {
uint32_t id
uint32_t hole -- the compiler must add here cause it mist align
uint64_t seq
}

我猜数据没有漏洞,所以要修复它,您需要将 seq 设置为 uint32_t 并稍后进行转换。

关于c - 接收到的网络数据包中的内存对齐问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38770559/

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