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

时间:2016-08-04 14:44:12

标签: c memory linux-kernel network-programming

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

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->类型的地址。

理想情况下,这应该意味着id(在syn和ack结构中)应该映射到hdr->type,而struct hdr之后的任何内容应该映射到syn->cookie或{{1取决于我映射到ack->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->cookie具有相同的尺寸时,为什么ack->sequencehdr->type会在相对于ack->id的不同偏移处开始?

编辑1:我使用

映射这些结构
syn->id

3 个答案:

答案 0 :(得分:1)

因为你在64位工作,编译器填充结构如下:

import arcpy, os
from arcpy import env
from arcpy.sa import *

env.workspace = "C:/rasters/threshold"
outws = "C:/SIG/MelasCA_30runs_avg/threshold/mesoamerica"
mask = "C:/GIS/mesoamerica.shp"

rasterlist = arcpy.ListDatasets("*", "Raster")
for i in rasterlist:
    outExtractByMask = ExtractByMask(i, mask)
    outname = os.path.join(outws, str(i)) # Create the full out path
    outExtractByMask.save(outname)

我猜数据没有漏洞,所以要修复它,你需要将seq设置为uint32_t并稍后再投射。

答案 1 :(得分:1)

https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#Common-Type-Attributes

看看packed。无论出于何种原因,GCC不允许我直接链接到该部分。

答案 2 :(得分:0)

您应该将结构定义如下。属性打包表示allignment应为1个字节。 以下结构将是12个字节长。如果你不使用" attribyte"关键字,你的结构长16个字节。

struct yours{
 __be32 id;      
 __be64 cookie;
}__attribute__((__packed__));