使用UDP广播检测网络上的多个设备-C#
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用UDP广播检测网络上的多个设备-C#相关的知识,希望对你有一定的参考价值。
我知道,有关UDP广播的许多问题可用于检测网络设备,但没有一个答案对我真正有用。我想我缺少了一些东西,将不胜感激。
我设计了一个系统,该系统位于网络上并运行UDP服务器。在某个端口(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#的主要内容,如果未能解决你的问题,请参考以下文章