gpt4 book ai didi

c - 为什么此代码会生成不完整的 IP 地址?

转载 作者:太空宇宙 更新时间:2023-11-04 08:54:30 25 4
gpt4 key购买 nike

我正在使用以下代码从套接字 (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));
}
}
}

最佳答案

struct ether_arp 看起来像这样:

struct  ether_arp {
struct arphdr ea_hdr; /* fixed-size header */
u_int8_t arp_sha[ETH_ALEN]; /* sender hardware address */
u_int8_t arp_spa[4]; /* sender protocol address */
u_int8_t arp_tha[ETH_ALEN]; /* target hardware address */
u_int8_t arp_tpa[4]; /* target protocol address */
};

考虑到这一点,我认为您的 addr.s_addr = *arp_frame->arp_spa; 看起来有点可疑。 arp_frame->arp_spa 生成一个 u_int8_t[4],然后您将其作为指针取消引用。我认为 memcpy() 在那里可能更合适。

关于c - 为什么此代码会生成不完整的 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17980034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com