【问题标题】:Multible programs/instances using the same UDP Port in C#在 C# 中使用相同 UDP 端口的多个程序/实例
【发布时间】:2021-03-16 13:42:49
【问题描述】:

我正在为一些网络魔法而苦苦挣扎,希望有人能够向我解释发生了什么。

我正在尝试重用 udp 端口​​。因此,如果我有多个程序在同一个 udp 端口​​上侦听,我希望这两个应用程序都接收由不同设备发送的数据。

使用以下代码我可以做到这一点:

            IPEndPoint localEndoint = new IPEndPoint(IPAddress.Any, 67);    //the local endpoint used to listen to port 67
            //Create a new UDP Client and bind it to port 67
            DhcpSniffer = new UdpClient();
            DhcpSniffer.ExclusiveAddressUse = false;    //Allow multible clients to connect to the same socket
            DhcpSniffer.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); // Connect even if socket/port is in use
            DhcpSniffer.Client.Bind(localEndoint);
            DhcpSniffer.Client.ReceiveTimeout = Timeout;
            //receive on port 67 
            dhcpPacket = DhcpSniffer.Receive(ref localEndoint);

我的两个程序都可以监听网络中的 DHCP 消息,并且不会互相阻塞。 现在我想对 RTP 视频流流式传输到的端口 15120 做同样的事情。但是,这不起作用。我正在使用相同的代码,但没有成功,一次只有一个应用程序可以接收流,另一个将超时运行。

            IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, port);
            //Create a new UDP Client and bind it to port 15120
            udpReceiver = new UdpClient();
            udpReceiver.ExclusiveAddressUse = false;    //this is an attempt to receive the stream on mutlible instances...this works for DHCP but not for RTP for some reason....
            udpReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); // Connect even if socket/port is in use
            udpReceiver.Client.ReceiveTimeout = timeout;    //set the sockete timeout
            udpReceiver.Client.Bind(RemoteIpEndPoint);      //bind to the port from any IP
            //receive packets on port 15120
            Byte[] receiveBytes = udpReceiver.Receive(ref RemoteIpEndPoint);

我希望有人能够阐明我的困惑

更新: 我发现它适用于 DHCP,因为它被发送到广播 IP (255.255.255.255)。现在我需要了解如何更改 Socket 行为以将我的 RTP 流视为已广播,以便我可以同时在两个应用程序中看到它。 (是的,我可以将我的流源配置为广播,但这不是目标)。 目标是重新配置 Socket 以按照解释的方式运行。不要将流保存在硬盘上或使用本地主机重定向它。

【问题讨论】:

  • 我刚刚发现如果我将视频流广播到 255.255.255.255 两个程序都可以看到数据。在我使用 udp 套接字读取非广播消息后,似乎正在删除非广播消息,而广播消息则没有。有没有办法改变这种行为?即使应用程序已经收到包,我可以让 udp 客户端保留套接字缓冲区中的包吗?
  • 据我所知 - 只是不可能从具有多个进程的同一端口接收 UDP 单播数据包,您需要为此使用多播。
  • @Evk 谢谢。我同意。我希望我可以以某种方式重新配置套接字以使其表现不同,但在 MS 文档中找不到任何关于它的信息,或者通过更深入地调试它。我知道我可以走 PCAP 路线,但这需要我想避免的依赖...我希望有人能提出建议或解决这个问题...

标签: c# sockets udp reusability


【解决方案1】:

首先,不可能有多个程序在同一个端口上监听(据我所知这是一个很大的安全冲突)

您可以做的难的是使用 NetworkManager 监听您的端口(我们称之为端口 8080),然后将信息重定向到您的应用程序端口(App1 可以使用端口 8081,App2 使用端口 8082)。要么您自己编写,使用 Flask 监听 8080,然后将包重新路由到 localhost:8081 和 localhost:8082,这可能是一个简单而快速的解决方案。

这样做可以帮助您保护网络,并且您可以根据需要重定向到任意数量的端口,就像 docker swarm 将传入网络平衡到其集群一样。

【讨论】:

  • 虽然这是解决底层问题的有效方法,但不幸的是,这不起作用,因为数据速率非常高,并且这种方法产生的开销会影响整个系统。但我很欣赏你对这个问题颇有创意的看法。
  • 我也有同样的看法,重复使用端口是不可能的,但它与广播消息一起工作的事实让我认为我可以通过重新配置套接字以某种方式让它工作
  • 好吧,从技术上讲,如果。您考虑在端口 80 上具有 2 个不同连接的 Web 服务器,该连接将呈现哪个页面?为了增加您的评论,添加一个小型网络管理器不会削弱您的系统。通过添加缓冲区,并考虑到 python 是此类任务的最佳选择之一,这将是我最好的建议。
【解决方案2】:

多个程序无法从单播 UDP 包访问数据,它仅适用于多播,通过重新配置 UdpClient 没有“简单”的解决方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2012-07-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    相关资源
    最近更新 更多