使用UDP广播检测网络上的多个设备-C#

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用UDP广播检测网络上的多个设备-C#相关的知识,希望对你有一定的参考价值。

我知道,有关UDP广播的许多问题可用于检测网络设备,但没有一个答案对我真正有用。我想我缺少了一些东西,将不胜感激。

我设计了一个系统,该系统位于网络上并运行UD​​P服务器。在某个端口(AP)上收到消息后,它将答复发送回发送IP /端口。

在C#端,我使用以下代码:

UdpClient Client = new UdpClient();
                var RequestData = Encoding.ASCII.GetBytes("Discover");
                var ServerEp = new IPEndPoint(IPAddress.Any, 0);
                byte[] ServerResponseData =  0 ;

                Client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);

                Client.EnableBroadcast = true;
                Client.Send(RequestData, RequestData.Length, new IPEndPoint(IPAddress.Broadcast, AnnouncePort));

                ServerResponseData = LanguageUtils.IgnoreErrors(() => Client.Receive(ref ServerEp));

                if (ServerResponseData != null)
                
                    var ServerResponse = Encoding.ASCII.GetString(ServerResponseData);

                    deviceList.Add(ServerEp.Address.ToString());

                    QueryFoundDevices(deviceList);
                    AvailableDevicesList.Nodes[0].Expand();
                

我的问题是我一次只能检测到一个设备。理想情况下,我希望能够从数量不限的设备接收消息。

我也尝试过使用异步方法,在这种情况下,我只会收到自己的消息,而看不到任何设备。的代码示例:

static void OnUdpData(IAsyncResult result)
        
            // this is what had been passed into BeginReceive as the second parameter:
            UdpClient socket = result.AsyncState as UdpClient;
            // points towards whoever had sent the message:
            IPEndPoint source = new IPEndPoint(0, 0);
            // get the actual message and fill out the source:
            byte[] message = socket.EndReceive(result, ref source);
            // do what you'd like with `message` here:
            Console.WriteLine("Got " + message.Length + " bytes from " + source);
            // schedule the next receive operation once reading is done:
            socket.BeginReceive(new AsyncCallback(OnUdpData), socket);
        

谁能告诉我我该怎么做?

更新:根据评论-这些是基于以太网的设备,我已经验证了这两个设备都在使用Wireshark进行答复。

答案

我不知道在哪里做这件事是正确的,但是我现在根据Lex Li的评论制定了一种做这件事的方法。我以为我可以分享这一点,以防其他人遇到类似的问题。

                UdpClient Client = new UdpClient();
                var RequestData = Encoding.ASCII.GetBytes("Discover");
                var ServerEp = new IPEndPoint(IPAddress.Any, 0);
                byte[] ServerResponseData =  0 ;

                Client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);

                Client.EnableBroadcast = true;
                Client.Send(RequestData, RequestData.Length, new IPEndPoint(IPAddress.Broadcast, AnnouncePort));

                ServerResponseData = LanguageUtils.IgnoreErrors(() => Client.Receive(ref ServerEp));
                string ServerResponse;
                while (ServerResponseData != null)
                
                    ServerResponse = Encoding.ASCII.GetString(ServerResponseData);

                    deviceList.Add(ServerEp.Address.ToString());

                    QueryFoundDevices(deviceList);
                    AvailableDevicesList.Nodes[0].Expand();

                    ServerResponseData = LanguageUtils.IgnoreErrors(() =>Client.Receive(ref ServerEp))
                

Lex Li指出,我在答案中发布的第一个代码部分只会收到第一个答复。我试图阅读下一个响应,它奏效了。我现在正在使用上面的方法,它可能需要进一步优化,但到目前为止效果很好。

感谢您的帮助!

以上是关于使用UDP广播检测网络上的多个设备-C#的主要内容,如果未能解决你的问题,请参考以下文章

UDP 单播广播多播

在本地测试 UDP 广播

UDP广播包

通过 LAN 广播 UDP 数据报包

计算机网络学习笔记5-UDP广播

Win 10 应用开发UDP广播