我正在使用以下代码从套接字(AF_PACKET、SOCK_DGRAM、htons(ETH_P_ARP))读取缓冲区。我正在使用 arp_frame 结构来访问包含的 ARP 回复的组成部分。inet_ntoa() 返回正确的 IP 的第一个八位字节,但其他八位字节为 0,生成 172.0.0.0。
问题 1 为什么会发生这种情况?问题 2 是如何以主机字节顺序将 msg 缓冲区的 r 字节打印为十六进制以调试数据包?
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));
}
}
}