gpt4 book ai didi

c++ - 通过原始套接字发送源 MAC 和 IP

转载 作者:行者123 更新时间:2023-11-30 05:36:49 28 4
gpt4 key购买 nike

我是原始套接字的新手,我正在尝试关注 this教程。我可以看到使用 wireshark 传输的数据包,这很棒。

但是,该教程中的源 MAC 和源 IP 丢失并进行了解释 herehere .

问题是当我尝试将源 MAC 复制到已知结构时:

ioctl(fd,SIOCGIFINDEX,&ifr)   // `fd` and `ifr` already defined
ioctl(fd,SIOCGIFHWADDR,&ifr)

const unsigned char* mac = (unsigned char*)ifr.ifr_hwaddr.sa_data;

printf("my MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n", // prints my mac- works fine
mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);

memcpy(&req.arp_sha, mac, sizeof(req.arp_sha)); // `req` is already defined

当我调试代码时,mac 包含真实的 MAC 地址,而 req.arp_sha 包含其他内容。

我也试过这样复制:

req.arp_sha[0] = mac[0];
req.arp_sha[1] = mac[1];

编辑我期望的 MAC 是:08:00:27:E7:56:0B我得到的 MAC 是:00:00:0a:00:02:0f

当我对 IP 地址执行相同操作时,效果很好,我可以在 wireshark 上看到。

这是IP代码:

ioctl(fd,SIOCGIFADDR,&ifr);

struct sockaddr_in* ipaddr = (struct sockaddr_in*)&ifr.ifr_addr;
const char * myIp = inet_ntoa(ipaddr->sin_addr);
printf("my IP address: %s\n", myIp);

memcpy(&req.arp_spa,&ipaddr->sin_addr,sizeof(req.arp_spa));

我不明白我是否在这里做错了什么,我很乐意提供指导。

谢谢。

最佳答案

req是这个类型吗?

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

你没有展示完整的代码,是吗?

在您所说的第一个代码段中,您是否在 printf 之后立即调用了 memcpy?它不起作用的唯一可能性是 mac 是指向 ifr.ifr_hwaddr.sa_data 的指针。可能你调用的时候sa_data的内容被覆盖了

memcpy(&req.arp_sha, mac, sizeof(req.arp_sha));

尝试将 mac 定义为数组并将内容从 ifr.ifr_hwaddr.sa_data 复制到 mac。

在第二个片段中,它应该不会很好地工作,即使你说它有效。这不行:

memcpy(&req.arp_spa,&ipaddr->sin_addr,sizeof(req.arp_spa));

sin_addr 是一个 unsigned long,它是小端,而 req.arp_spa 应该是大端。你确定它在 wireshark 中看起来正确吗?你能打印出来吗?

关于c++ - 通过原始套接字发送源 MAC 和 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33444552/

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