免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
天蝎座
日期:2013-10-23 21:11:03
2 [报告]
发表于 2014-10-11 12:12 |只看该作者
没有 drop/forward 之类的代码逻辑?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2014-10-11 12:39 |只看该作者
hue2550 发表于 2014-10-11 10:33
程序是这样的,
线程1:使用原始套接字从eth0接收MAC帧,判断处理后再通过原始套接字从eth1发送出去,
线 ...


一个是判断一下报文的来源,其次是处理过的报文,做一下标记。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
4 [报告]
发表于 2014-10-11 20:20 |只看该作者
判断报文来说可能不太可行。因为这个报文可以已经是转了一大圈回来的。做个标识应该是可以的,但改用户的报文始终觉得不太好。

你肯定把Linux的两个网卡又插在同一个交换机上了,因此形成的典型的回环。
抛开你对数据包的处理,你的Linux实际上充当的是一个二层的桥设备,或都说是只有两个口的交换机。
多个交换机的多个端口同时相连就行成环路,在交换机上,我们一般采用的是STP(Spanning Tree Protocol)协议,检测回环并打断回环。详情见:
http://hen-neko.org/howtos/bridging.html

但从你的意图来说,我想你并不想你的桥被打断,因此,请从物理链接层面去让环路消失。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-11-28 06:20:00
5 [报告]
发表于 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