作者chigi ( )
看板C_and_CPP
标题[问题] 多网卡的raw socket疑问
时间Tue Aug 20 15:56:30 2019
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
我太无聊了想用两张网卡拿raw socket做bridge
至於这个可以做什麽就..嘿嘿
喂入的资料(Input):
开两个raw socket
int sockin = socket(PF_PACKET, RAW_SOCK, htons(ETH_P_ALL);
int sockout = socket(PF_PACKET, RAW_SOCK, htons(ETH_P_ALL);
注 promisc已经用其他方法处理好了
然後bind socket
setsockopt(sockin, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4);
setsockopt(sockout, SOL_SOCKET, SO_BINDTODEVICE, "eth1", 4);
然後recv资料
n = recvfrom(sockin, buf, 1500, (struct sockaddr *)&rcvaddr, &len);
稍微修改一下rcvaddr的资料:
rcvaddr.sll_pkttype = 0;
rcvaddr.sll_hatype = 0;
rcvaddr.sll_ifindex = 3; //eth0的 index是2, eth1 的index是3
m = sendto(sockout, buf, 1500, (struct sockaddr *)&rcvaddr,
sizeof(struct sockaddr);
至此编译完执行,一端就通了
预期的正确结果(Expected Output):
理论上另一端执行完应该也要能通,
但是却出现了怪事。从eth0收到的资料往eth1丢时
另一个eth1接收的软体觉得socket里面有东西又把它捞了出来,又丢回eth0
结果封包像是乒乓球一样在两个recv的socket中疯狂地转送
现在我是有用个判断,偷看ethernet表头让这个转送停下来,
但是相对效能就变差了。
想请问一下,这样的socket现象是正常的吗?
就是sendto的封包会被另外一只recvfrom从socket又收回来
有没有什麽flag可以强制他不要收送出的封包?
其他做过的测试,我试过不要bind,
这更可怕,recvfrom的指令两边都收的到根本大杂烩
所以bind是有用的,
至於没有bind的时候sendto会送给谁..我不知道,蛮难确认的
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.160.200.71 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1566287792.A.675.html
1F:推 Schottky: 区域网路怎麽接的 08/21 02:52
网路的话
设备总共有三台,
eth0 eth1
PC1 <--------------> PC2 <----------------> PC3
IP: 192.168.1.200 192.168.1.105
192.168.1.100 NA
既然是bridge,其实PC2的eth0也可以不用IP
试过不用IP,但是封包还是在那乱弹
比较特别的是PC2的 ARP table
192.168.1.200 <MAC> on eth0
192.168.1.105 <MAC> on eth1
192.168.1.105 <incomplete> on eth0 <====?????
不过也有可能是程式乱跳让系统误以为那边也有一台105,
所以把ARP包往那边丢 但是想当然耳,那边什麽都没有
※ 编辑: chigi (1.160.200.71 台湾), 08/21/2019 09:17:34