次のコードを使用して、ソケット (AF_PACKET、SOCK_DGRAM、htons(ETH_P_ARP)) からバッファーを読み取っています。含まれている ARP 応答のコンポーネント部分にアクセスするために arp_frame 構造体を使用しています。inet_ntoa() は、IP の正しい最初のオクテットを返しますが、他のオクテットは 0 であり、172.0.0.0 を生成します。
質問 1 は、なぜこのようなことが起こるのでしょうか? 質問 2 は、パケットをデバッグするために、msg バッファーの r バイトをホストのバイト順で 16 進数として出力するにはどうすればよいですか?
unsigned char msg[65535];
struct ether_arp *arp_frame = (struct ether_arp *)msg;
while ((r = recv(sock, msg, sizeof(msg), 0))) {
// skip it's not an ARP REPLY
if (ntohs(arp_frame->arp_op) != ARPOP_REPLY)
continue;
for (i = 0; i < SONOS_PREFIX_NUM; i++) {
if (!memcmp(sonos_prefixes[i], arp_frame->arp_sha, 3)) {
struct in_addr addr;
addr.s_addr = *arp_frame->arp_spa;
printf("Blah: %lu\n", ntohl(*arp_frame->arp_spa));
printf("Sonos found at %s\n", inet_ntoa(addr));
}
}
}