以太网报头中src dst字段的初始化问题
目标:从零开始制作一个数据包并通过套接字发送 问题:目前,我不确定以太网报头结构是否具有正确的mac地址,因为打印显示的只是混乱的符号。我是否使用了错误的格式说明符,或者存在其他问题以太网报头中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
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字节,可能还打印了一堆字符。请将显示的代码转换为。请将显示的代码转换为。