2

これを書く意味がよくわからない

   struct iphdr *ip;
   struct icmphdr *icmp;
   char *packet;
   packet = malloc(sizeof(struct iphdr) + sizeof(struct icmphdr));
   ip = (struct iphdr *)packet;

なぜ をとpacket見なすのですか?charpacket = malloc(sizeof(struct iphdr));ip = malloc(sizeof(struct iphdr));

4

2 に答える 2

3

ウィキペディアによると、icmp ヘッダーは IP ヘッダーの直後に開始されるため、実装者はメモリの 1 つのチャンクを一緒に割り当ててパケットを指すようにすることを考えていたでしょう。

コードをさらにチェックして、パケットがさらにどのように使用されているかを確認できます。パケットの内容全体が、上位層からの一部のデータの前に追加されている可能性があります。

于 2013-05-28T11:48:28.513 に答える
1

コードは、ICMP パケットが IP ペイロードとして埋め込まれた IP パケットを割り当てているようです。そのため、 のサイズはmalloc()両方の構造を保持するのに十分な大きさです。

このようにする理由は、連続したメモリの 1 つのチャンクを取得してパケットを表すためです。iphdrと を別々に割り当てた場合icmphdr、メモリの 2 つのばらばらの部分にある可能性が高く、 に渡すことができませんでしたsendto()

コードは IP ヘッダーを定義しIP_HDRINCLているため、ソケット レイヤーが IP ヘッダーを自動的に生成しないように、ソケット オプションをソケットで有効にする必要があることに注意してください。

packet単なる大きなバッファと考えてください。次に*ip*icmpそのバッファ内の適切な場所を指すように設定されるため、構造体に生のバイトコピーを行うのではなく、構造体を使用して初期化できます。

于 2013-05-28T11:50:34.937 に答える