C# 确定多播套接字数据的发送方
我有两个进程在我的机器上运行,如下所示:C# 确定多播套接字数据的发送方,c#,sockets,multicast,C#,Sockets,Multicast,我有两个进程在我的机器上运行,如下所示: 正常客户端程序发送到多播224.1.2.3:8000 “路由器”过程 路由器进程连接到两个多播组: 224.1.2.3:8000 224.1.2.4:8001 路由器背后的想法很简单,当流量来自任一多播组时,只需将其转发到另一个多播组。为了做到这一点,我关闭路由器进程上的多播环回,这样它就不会“听到它发送的内容”(多播是正常的) 由于在同一台机器上运行一个“正常”进程,这一想法变得复杂。关闭多播环回后,路由器进程看不到来自正常进程的流量,因此无法正确路由
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.4:8001---
>
从224.1.2.4:8001接收_数据包
---将数据包转发至224.1.2.3:8000---
>
不幸的是,我不能简单地将这些信息编码到发送的数据包中
有什么想法吗?非常感谢您的帮助
--丹
编辑: 我的同事建议实现第三个多播组,专门用于普通客户端向路由器发送内容。在此场景中,普通客户端将侦听224.1.2.3:8000,并通过224.1.2.3:8002发送。路由器也会监听8002并适当地转发它。它永远不会通过8002发送任何内容(即,它将8002视为普通客户端的单向管道)
这实际上适用于许多情况,但不幸的是,在许多常见操作期间,底层软件需要在多播套接字上进行双向通信。所以这是不可能的 您可以让客户端与路由器位于同一台机器上,这样它的源IP就不同于路由器的源IP。好的,下面是我要做的工作: Jeff的建议让我考虑使用两个虚拟接口(每个程序一个)。不幸的是,如果我从受限块(即192.168.1.100和.101)给每个接口一个常规IP,我就无法找到在两个接口之间发送数据的方法 然后我考虑从环回范围(127.*)为每个接口提供一个IP。不幸的是,Windows不允许在环回空间中分配IP——当您在IP地址块中键入它时,它会弹出一个关于保留127的错误 所以我决定在我的程序中手动绑定到指定的IP。C#允许您绑定到127.*地址,因此我最终使用了127.0.0.2和127.0.0.3——为每个进程提供了一个唯一的地址 这并没有解决问题的多播部分——路由器进程看不到常规进程的通信量。因此,我不得不为两人编写一个UDP单播模块来进行对话(我本可以使用TCP,但应用程序的框架是使用UDP) 这最终成功了 +我在杰夫的帖子上为我指出了正确的方向
--Dan我对多播不太熟悉,但发送过程是否可以通过源端口识别?很可能这些进程会共享相同的源IP但不同的端口?不幸的是,对于多播,每个人在发送和接收时都必须使用相同的IP/端口组合。好主意,不幸的是,多播不能通过环回接口工作