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

以太网报头中src dst字段的初始化问题,c,networking,ethernet,packet,C,Networking,Ethernet,Packet,目标:从零开始制作一个数据包并通过套接字发送 问题:目前,我不确定以太网报头结构是否具有正确的mac地址,因为打印显示的只是混乱的符号。我是否使用了错误的格式说明符,或者存在其他问题 int main(){ const char IF[] = "wlp3s0"; // modify to change interface int sockfd, ifindex; struct ifreq ifr; size_t if_name_l

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

问题:目前,我不确定以太网报头结构是否具有正确的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);
intmain(){
const char IF[]=“wlp3s0”;//修改以更改接口
int sockfd,ifindex;
结构ifreq-ifr;
尺寸(如果名称);
字符大小[buf_SIZE];
结构以太单元头*eh=(结构以太单元头*)buf;
结构iphdr*iph=(结构iphdr*)(buf+sizeof(结构ether_头));
//创建原始套接字以发送/接收传输ip数据包的以太网帧
if((sockfd=socket(AF_数据包,SOCK_原始,htons(ETH_P_IP)))=-1){
佩罗(“插座”);
}
//获取接口名称长度
if_name_len=strlen(if);
if(if_name_len以太主机、dmac、以太地址);
printf(“%s\n”,eh->ether\u dhost);

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


出现奇怪符号的原因是,您让
printf
打印字符串。字符串是一系列字节,其中每个字节都是字符的ASCII码,后跟一个0字节以指示字符串的结尾。
printf
将打印ASCII码0xAA、0xBB、0xCC、0xDD、0xEE、0xFF,然后继续打印,直到完成为止碰巧找到了一个0字节,可能还打印了一堆字符。

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


出现奇怪符号的原因是,您让
printf
打印字符串。字符串是一系列字节,其中每个字节都是字符的ASCII码,后跟一个0字节以指示字符串的结尾。
printf
将打印ASCII码0xAA、0xBB、0xCC、0xDD、0xEE、0xFF,然后继续打印,直到完成为止碰巧找到一个0字节,可能还打印了一堆字符。

请将显示的代码转换为。请将显示的代码转换为。