[问题] 多网卡的raw socket疑问

楼主: chigi (  )   2019-08-20 15:56:30
开发平台(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会送给谁..我不知道,蛮难确认的
作者: Schottky (顺风相送)   2019-08-21 02:52:00
局域网路怎么接的

Links booklink

Contact Us: admin [ a t ] ucptt.com