我的盒子上运行了两个进程,如下所示:
路由器进程加入了两个组播组:
路由器背后的想法很简单,当流量来自任一组播组时,只需将其转发到另一个组播组即可。为了做到这一点,我在路由器进程上关闭了多播环回,这样它就不会“听到它发送的内容”(正如多播一样正常。)
由于在同一台机器上运行“正常”进程,这个想法很复杂。关闭组播环回后,路由器进程看不到源自正常进程的流量,因此正常进程的流量无法正确路由。
我可以在路由器进程中启用多播环回,但我不知道如何识别发送数据包的进程。在没有识别数据包的源进程的情况下,我陷入了一个循环:
receive_packet from 224.1.2.3:8000
--- Forward packet to 224.1.2.4:8001 ---
<< Forwarding causes a receive packet >>
receive_packet from 224.1.2.4:8001
--- Forward packet to 224.1.2.3:8000 ---
<< Forwarding causes a receive packet >>
不幸的是,我不能简单地将这些信息编码到发送的数据包中。
有什么想法吗?非常感谢所有帮助。
- 丹
编辑:
我的同事建议专门为普通客户端实现第三个组播组,以便向路由器发送内容。在这种情况下,普通客户端将侦听224.1.2.3:8000并发送到224.1.2.3:8002。路由器也会监听8002并适当地转发它。它永远不会在8002上发送任何东西(即它会将8002视为来自普通客户端的单向管道。)
这实际上适用于许多情况,但不幸的是,底层软件需要在多个常见操作期间在多播套接字上进行双向通信。所以这是不行的。
答案 0 :(得分:2)
您可以将客户端与路由器bind to a virtual interface放在同一台计算机上,以使其源IP与路由器的源IP不同。
答案 1 :(得分:0)
好的,这就是我必须做的才能让它发挥作用:
杰夫的建议让我考虑使用两个虚拟接口(每个程序一个。)不幸的是,如果我给每个接口提供一个来自受限块的常规IP,那么我无法找到在两者之间发送数据的方法(即。 192.168.1.100&amp; .101。)
然后我考虑从环回范围(127. *)给每个接口一个IP。不幸的是,Windows不允许在环回空间中分配IP - 一旦在IP地址块中输入,就会弹出一个大约127的错误。
所以我决定只在我的程序中手动绑定到指定的IP。 C#允许您绑定到127. *地址,因此我最终使用127.0.0.2和127.0.0.3 - 为每个进程赋予唯一性。
这并没有解决问题的多播部分 - 路由器进程无法看到常规进程的流量。所以 - 我不得不为两个人写一个UDP单播模块(我本可以使用TCP,但该应用程序被设置为使用UDP。)
这最终成功了。
+1给杰夫的帖子指出我正确的方向
- 丹