私はLinuxカーネルにカスタムプロトコルを書いています。私はhdr-のアドレスにsyn
とack
(異なるパケット用)の構造をマッピングするには、次の構造 受信したネットワークパケットのメモリアラインメントの問題
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
};
私はパケットの送受信
を使用しています>と入力します。これは、理想的には(SYNとACK構造で)idはhdr->type
にマッピングする必要がありますし、何でもstruct hdr
を以下のは、私がhdr->type
へマッピングするよどの構造体に依存し、syn->cookie
またはack->sequence
のいずれかにマッピングされるべきであることを意味する必要があります。
しかし、これらの変数のメモリアドレスをプリントアウトの上、私は次の
//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
を取得ack->id
とsyn->id
が同じサイズを持っているとき、なぜhdr->type
に対して異なるオフセットでsyn->cookie
とack->sequence
開始しますか?
EDIT 1:あなたは64ビットのコンパイラで作業するので、私は
char *ptr = (char *)&hdr->type;
//For syn
struct syn *syn1 = (struct syn *)ptr
//For ack
struct ack *ack1 = (struct ack *)ptr
キーワードは*アライメント* ... – Nim
あなたは「私はhdr-のアドレス>を入力する(異なるパケットのために)構造がSYNとACKマップ。」とはどういう意味ですかいるのですか?私は、オブジェクトの有効な型ではない型の左辺値を持つオブジェクトにアクセスする、および/または境界外にアクセスする、未定義の振る舞いを嗅ぐ。 – EOF
はい、私は理解していますが、別の構造を使用してパケットを入力しても、毎回同じ方法でパケットにアクセスできるようにする方法が必要です –