1

ICMPパケットをフレーム化して、rawソケットを介して送信しようとしています。例を見ると、IPパケットの長さは次のように計算されていることがわかります。

iphdr.ip_hl = sizeof(struct ip)>> 2

constan値を割り当てる代わりにstructipを2回右シフトする必要がある理由を説明してください。

4

2 に答える 2

3

IP(またはICMP)パケットの「ip_hl」フィールドは、32ビットワードでのIPヘッダーの長さとして定義されます。

sizeof(struct ip)は、IPヘッダーの長さを8ビットバイトで出力します。この値を2回右シフトすると、ip_hlフィールドで予想されるように、32ビットワードの長さが提供されます。

これに定数を使用しない正当な理由は、ソースコードのマジックナンバーを排除することです。(コンパイラはとにかく'sizeof(struct ip)>> 2'に対して定数値を生成します)。

于 2012-12-17T19:56:50.317 に答える
1

4ビットヘッダー長フィールドは、オプションを含むヘッダー内の32ビットワードの数であるため、20バイト(フィールド値5)より長くなる可能性があるため、定数値ではないはずです。あなたの例は、オプションのシナリオがないと仮定しています。

于 2012-12-17T19:54:14.437 に答える