Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定多播套接字数据的发送方_C#_Sockets_Multicast - Fatal编程技术网

C# 确定多播套接字数据的发送方

C# 确定多播套接字数据的发送方,c#,sockets,multicast,C#,Sockets,Multicast,我有两个进程在我的机器上运行,如下所示: 正常客户端程序发送到多播224.1.2.3:8000 “路由器”过程 路由器进程连接到两个多播组: 224.1.2.3:8000 224.1.2.4:8001 路由器背后的想法很简单,当流量来自任一多播组时,只需将其转发到另一个多播组。为了做到这一点,我关闭路由器进程上的多播环回,这样它就不会“听到它发送的内容”(多播是正常的) 由于在同一台机器上运行一个“正常”进程,这一想法变得复杂。关闭多播环回后,路由器进程看不到来自正常进程的流量,因此无法正确路由

我有两个进程在我的机器上运行,如下所示:

  • 正常客户端程序发送到多播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/端口组合。好主意,不幸的是,多播不能通过环回接口工作