【发布时间】: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