免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1896 | 回复: 1
打印 上一主题 下一主题

[网络子系统] 双网口原始套接字转发通信导致死循环 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-11-28 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-11 10:33 |显示全部楼层 |倒序浏览
程序是这样的,
线程1:使用原始套接字从eth0接收MAC帧,判断处理后再通过原始套接字从eth1发送出去,
线程2:使用原始套接字从eth1接收MAC帧,判断处理后再通过原始套接字从eth0发送出去。

结果有数据一来,就在eth0->eth1->eth0->eth1……无限循环下去了。其实原本功能是想做一个IP数据包过滤、转发的功能。请问问题出在哪里呢?谢谢大家!

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-11-28 06:20:00
2 [报告]
发表于 2014-10-11 21:55 |显示全部楼层
问题已经解决,使用的原始套接字:
sock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
其中:
ETH_P_IP 0X0800 只接收发往目的MAC是本机的IP类型的数据帧,而从eth0接收到的MAC帧中的目的MAC地址是就是eth0端口的MAC地址,如果不改变直接从eth1发送出去:
n = recvfrom(sock,buffer,2048,0,NULL,NULL);
便又接收回来了,所以一直循环了。
解决办法:
从eth0收到MAC帧后,提取出目的IP地址,查询eth1中的ARP表,找到目的IP地址对应的MAC地址,然后更改MAC帧后再从eth1转发出去就可以了。

评分

参与人数 1可用积分 +2 收起 理由
Godbach + 2 感谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP