记使用原始套接字导致丢包的问题

现象:

网卡上能抓到包,但是绑定在该网卡上的侦听程序收不到包。

分析:

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)));
...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值