C# 在C语言中使用相同UDP端口的多表程序/实例#

C# 在C语言中使用相同UDP端口的多表程序/实例#,c#,sockets,udp,reusability,exclusiveaddressuse,C#,Sockets,Udp,Reusability,Exclusiveaddressuse,我正在与一点网络魔术作斗争,希望有人能向我解释发生了什么 我正在尝试重用udp端口。因此,如果我有多个程序在同一个udp端口上侦听,我希望两个应用程序都能接收不同设备发送的数据 使用以下代码,我能够实现以下目标: IPEndPoint localEndoint = new IPEndPoint(IPAddress.Any, 67); //the local endpoint used to listen to port 67 //Create

我正在与一点网络魔术作斗争,希望有人能向我解释发生了什么

我正在尝试重用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消息,并且不会相互阻塞。 现在,我想对端口15120做同样的事情,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)。现在我需要了解如何更改套接字行为,将RTP流视为广播流,以便在两个应用程序中同时看到它。(是的,我可以将流源配置为广播,但这不是本文的目标)。
目标是重新配置套接字,使其按照所解释的方式运行。不要将流保存在硬盘上或使用本地主机重定向流。

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

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


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

我刚刚发现,如果我将视频流广播到255.255.255.255,两个程序都可以看到数据。在我使用udp套接字读取非广播消息之后,似乎非广播消息被删除了,而广播消息则没有。有没有办法改变这种行为?即使应用程序已经接收到包,我是否可以让udp客户端将包保存在套接字缓冲区中?据我所知,在多个进程中从同一端口接收udp单播包是不可能的,您需要使用多播。@Evk谢谢。我同意。我希望我能以某种方式重新配置插座,使其表现不同,但是在MS文档中找不到任何关于它的信息,或者通过深入调试…我知道我可以走PCAP路线,但这需要我想要避免的依赖性…我希望有人能提出建议或其他东西来解决这个问题…虽然这是一个解决基础问题的有效方法,不幸的是,这不起作用,因为数据速率非常高,并且这种方法产生的开销会影响整个系统。但我很欣赏你在这个问题上的富有创造性的观点。我也有同样的观点,重用端口是不可能的,但它与广播消息一起工作的事实让我认为,通过重新配置socketWell,我可以让它以某种方式工作,从技术上讲,如果。您可以考虑在端口80上有两个不同连接的web服务器,该连接将呈现哪个页面?为了增加您的评论难度,添加一个小型网络管理器不会削弱您的系统。通过添加缓冲区,并且考虑到python是此类任务的最佳选择之一,这将是我的最佳建议。