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

问题描述 投票:1回答:1

我对原始套接字有点新意,我正在尝试遵循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));

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

谢谢。

c++ sockets network-programming
1个回答
1
投票

请问这种类型?

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,它是little endian,而req.arp_spa应该是big endian。你确定它在wireshark中看起来正确吗?你能打印出来吗?

© www.soinside.com 2019 - 2024. All rights reserved.