确定多播套接字数据的发送者

时间:2011-03-17 20:21:07

标签: c# sockets multicast

我的盒子上运行了两个进程,如下所示:

  1. 正常客户端程序发送到组播224.1.2.3:8000
  2. “路由器”流程
  3. 路由器进程加入了两个组播组:

    1. 224.1.2.3:8000
    2. 224.1.2.4:8001
    3. 路由器背后的想法很简单,当流量来自任一组播组时,只需将其转发到另一个组播组即可。为了做到这一点,我在路由器进程上关闭了多播环回,这样它就不会“听到它发送的内容”(正如多播一样正常。)

      由于在同一台机器上运行“正常”进程,这个想法很复杂。关闭组播环回后,路由器进程看不到源自正常进程的流量,因此正常进程的流量无法正确路由。

      我可以在路由器进程中启用多播环回,但我不知道如何识别发送数据包的进程。在没有识别数据包的源进程的情况下,我陷入了一个循环:

      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视为来自普通客户端的单向管道。)

      这实际上适用于许多情况,但不幸的是,底层软件需要在多个常见操作期间在多播套接字上进行双向通信。所以这是不行的。

2 个答案:

答案 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给杰夫的帖子指出我正确的方向

- 丹