ICMPパケットをフレーム化して、rawソケットを介して送信しようとしています。例を見ると、IPパケットの長さは次のように計算されていることがわかります。
iphdr.ip_hl = sizeof(struct ip)>> 2
constan値を割り当てる代わりにstructipを2回右シフトする必要がある理由を説明してください。
IP(またはICMP)パケットの「ip_hl」フィールドは、32ビットワードでのIPヘッダーの長さとして定義されます。
sizeof(struct ip)は、IPヘッダーの長さを8ビットバイトで出力します。この値を2回右シフトすると、ip_hlフィールドで予想されるように、32ビットワードの長さが提供されます。
これに定数を使用しない正当な理由は、ソースコードのマジックナンバーを排除することです。(コンパイラはとにかく'sizeof(struct ip)>> 2'に対して定数値を生成します)。
4ビットヘッダー長フィールドは、オプションを含むヘッダー内の32ビットワードの数であるため、20バイト(フィールド値5)より長くなる可能性があるため、定数値ではないはずです。あなたの例は、オプションのシナリオがないと仮定しています。