0

次のコードを使用して、ソケット (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));
                    }
            }
    }
4

2 に答える 2

0

API が壊れていると思われる場合は、バイトを出力してください。

「考えてみれば、ブルータス、せいは星にあるのではありません。」

于 2013-07-31T20:17:54.997 に答える