1

この「struct iphdr* ip_reply」を使用して、この関数で受信したパケットを読み取ります。

recvfrom(sockfd, buffer, sizeof(struct iphdr) + sizeof(struct icmphdr), 0, (struct sockaddr *)&connection, &addrlen))

ip_reply = (struct iphdr*) バッファ; // キャスト => 受信したパケットから IP ヘッダーを読み取る

これは構造体パラメータです:

      struct iphdr {  #if defined(__LITTLE_ENDIAN_BITFIELD)
     __u8    ihl:4,
            version:4;  #elif defined (__BIG_ENDIAN_BITFIELD)
     __u8    version:4,
             ihl:4;

   __u8    tos;
   __be16  tot_len;
   __be16  id;
   __be16  frag_off;
   __u8    ttl;
   __u8    protocol;
   __sum16 check;
   __be32  saddr;
   __be32  daddr;
    /*The options start here. */  };

printfで「saddr」「daddr」を表示するにはどうすればよいですか?

4

2 に答える 2

1

libc には、これらの変換を処理する関数のグループがあります。あなたの場合、次の関数を使用できますinet_ntoa()。基本的に、ネットワーク バイナリ形式 (ネットワーク バイト オーダー) でアドレスを取得し、ドット表記を使用して IPv4 アドレスを文字列に取得します。

unix SO を使用している場合は、man ページを参照して正しい使用法を確認することをお勧めします。

于 2013-07-04T15:51:05.330 に答える