问题背景:
想要协议栈给不是接口ip的报文,ipv4回复arp request,ipv6回复 ndisc solication。
#include//调用该函数成为一个守护进程void daemon(void){ return;}/*ipv4*/void parent(void){ //创建socket socket(); while(1) { recvfrom(); //正确性检查 write_log(); switch () { default : continue; case : ; } //判断是否在地址池中 if () continue; arp_reply(); } return;}/*ipv6*/void child(void){ //创建socket socket(); while(1) { recvfrom(); //正确性检查 write_log(); //判断协议类型,只处理ndisc ns报文 switch () { default : continue; //while cycle case : ; } if () continue; icmpv6_ndisc_ns(); } return;}int main(){ pid_t pid; daemon(); if (pid > 0) { parent(); } else if (pid == 0){ child(); } else { perror("fork error"); return -1; } return 0;}
涉及技术:
1.守护进程(apue中有通用code)
2.raw socket抓包
3.文件读写锁
4.用户态回复数据包(参见arposion)
5.写日志
应用:
1.可以使用这个程序导致同一局域网内pc ip地址冲突,因为是pc使用一个ip地址时候都会用arp、icmpv6做重复地址检测。进一步可以设定mac地址,从而实现局域网内的mac、ip地址绑定。