以太网头中 src dst 字段的初始化问题

Problem in the initialization of src dst fields in the ethernet header

目标: 从零开始制作一个数据包并通过套接字发送它

问题: 目前我不确定以太网头结构是否具有正确的 mac 地址,因为打印显示的只是混乱的符号。是我使用了错误的格式说明符还是存在其他问题?

int main(){

        const char IF[] = "wlp3s0"; // modify to change interface
        int sockfd, ifindex;
        struct ifreq ifr;
        size_t if_name_len;
        char buf[BUF_SIZE];
        struct ether_header *eh = (struct ether_header *) buf;
        struct iphdr *iph = (struct iphdr *) (buf + sizeof(struct ether_header));

        // create raw socket to send/receive ethernet frames that transport ip packet
        if ((sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP))) == -1) {
            perror("socket");
        }

        // get interface name length
        if_name_len = strlen(IF);
        if(if_name_len < IF_NAMESIZE) {
                strncpy(ifr.ifr_name, IF, strlen(IF));
        }

        // get the interface index number
        if(ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1){
                perror("ioctl");
        }
        ifindex = ifr.ifr_ifindex;

        // build ethernet header        
        const char dmac[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
        memcpy(eh->ether_dhost, dmac, ETHER_ADDR_LEN);
        printf("%s\n", eh->ether_dhost);

printf 调用显示奇怪的符号,因为您使用了错误的格式说明符。没有正确的格式说明符来打印 MAC 地址。您可以使用 %02hhx 单独打印每个部分(即使用 6 次)。

你得到奇怪符号的原因是因为你告诉 printf 打印一个字符串。字符串是一系列字节,其中每个字节都是一个字符的 ASCII 代码,后跟一个 0 字节以指示字符串的结尾。 printf 将打印 ASCII 码 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,然后它会继续打印直到恰好找到一个 0 字节,可能还会打印更多字符。