< 0) {continue;}if (pfd.revents & POLLIN) {unsigned char *stream = nm_nextpkt(nmr, &h);struct ethhdr *eh = (struct ethhdr *) stream;if (ntohs(eh->h_proto) == PROTO_IP) {struct ippkt *iph = (struct ippkt *) stream;if (iph->ip.type == PROTP_UPD) {struct udppkt *udp = (struct udppkt *) stream;int udplength = ntohs(udp->udp.length);udp->data[udplength - 8] = '';printf("udp ---> %sn", udp->data);struct udppkt udp_rt;echo_udp_pkt(udp, &udp_rt);nm_inject(nmr, &udp_rt, sizeof(struct udppkt));}else if (iph->ip.type == PROTO_ICMP) {struct icmppkt *icmp = (struct icmppkt *) stream;printf("icmp ---------- --> %d, %xn", icmp->icmp.type, icmp->icmp.check);if (icmp->icmp.type == 0x08) {struct icmppkt icmp_rt = {0};echo_icmp_pkt(icmp, &icmp_rt);nm_inject(nmr, &icmp_rt, sizeof(struct icmppkt));}}}else if (ntohs(eh->h_proto) == PROTO_ARP) {struct arppkt *arp = (struct arppkt *) stream;struct arppkt arp_rt;if (arp->arp.dip == inet_addr("192.168.109.100")) {echo_arp_pkt(arp, &arp_rt, "00:0c:29:1b:18:20");nm_inject(nmr, &arp_rt, sizeof(arp_rt));printf("arp retn");}}}}nm_close(nmr);}//gcc -o main main.c -I /netmap/sys///insmod netmap.ko测试能否回应ping请求
- 开启netmap
root@wxf:/netmap/LINUX# insmod netmap.ko root@wxf:/netmap/LINUX# ls /dev/netmap -lcrw------- 1 root root 10, 54 Jul 18 17:28 /dev/netmap
运行上面的代码,发现udp,arp,icmp都可以正常解析和发送文章插图
【用户态协议栈设计实现udp,arp与icmp协议】
推荐阅读
- 基于阿里云实现WEB访问故障转移静态提示页面
- hdr模式是什么?
- 饵料|男子钓鱼遇见孩子落水,急忙将其救起后,家长的态度让人无奈
- 职业教育|不愿向上,让自己永远处在一个低层的状态,那是毫无实力的表现
- 苹果|iPhone用户快升级!苹果发布iOS 15.6更新:修复存储已满等烦人问题
- 如何恢复连接? 打印机提示脱机状态
- 拜登特朗普谁对中国友好一些-拜登大胜对中国的态度
- 公积金封存状态怎么解封?
- 露华浓达成避免破产协议-露华浓为申请破产作准备
- 阳光心态的正能量句子有哪些?