现象:
网卡上能抓到包,但是绑定在该网卡上的侦听程序收不到包。
分析:
wireshark看包,结构也没啥问题。
怀疑应该是内核判断包有问题,选择丢包。最有可能的就是ip层校验和。
发包端的问题代码分析:
....
iphdr ipheader;
ipheader.version = 0x4;
ipheader.ihl = 0x5;
ipheader.tos = 0x00;
ipheader.tot_len = htons(sizeof(iphdr) + sizeof(udphdr) + data_len);
ipheader.id = 0x0000;
ipheader.frag_off = 0x0000;
ipheader.ttl = 16;
ipheader.protocol = 17; // udp:17, tcp:6
ipheader.saddr = inet_addr("0.0.0.0");
ipheader.daddr = inet_addr("255.255.255.255");
ipheader.check = htons((unsigned short)CalcCheckNum((unsigned char*)&ipheader, sizeof(ipheader)));
...
原因:在计算校验和之前,没有先将ipheader.check赋0。
修改后代码如下:
....
iphdr ipheader;
ipheader.version = 0x4;
ipheader.ihl = 0x5;
ipheader.tos = 0x00;
ipheader.tot_len = htons(sizeof(iphdr) + sizeof(udphdr) + data_len);
ipheader.id = 0x0000;
ipheader.frag_off = 0x0000;
ipheader.ttl = 16;
ipheader.protocol = 17; // udp:17, tcp:6
ipheader.saddr = inet_addr("0.0.0.0");
ipheader.daddr = inet_addr("255.255.255.255");
ipheader.check = 0; // 问题所在!!!
ipheader.check = htons((unsigned short)CalcCheckNum((unsigned char*)&ipheader, sizeof(ipheader)));
...