C#通過udp組播實現同網段內設備發現


項目需求:

能夠發現局域網中所有已經連接的設備,找到並顯示設備的ip、MAC、狀態及端口等信息。

udp組播之前沒有接觸過,通過網上找到的解決方案及自己在實際項目中測試,最后實現代碼大致如下:

  private static UdpClient _UdpClient;//聲明udp客戶端
  public event Action<Multicast> OnUdpMulticast;//定義處理數據事件
  private const int _RemotePort = 8161;//組播端口(根據需要修改)
  private const string _RemoteIP = "230.1.1.168";//組播組地址(根據需要修改)

  private bool _IsMulticast = false;//是否循環檢測標識

 Task taskUdp = new Task(() =>
 {
     try
     {
      IPAddress remoteAddress
= IPAddress.Parse(_RemoteIP);//轉換標准IPAddress       _UdpClient = new UdpClient(_RemotePort);//創建udp客戶端       _UdpClient.JoinMulticastGroup(remoteAddress);//加入組播組 IPEndPoint ipeRemote = new IPEndPoint(remoteAddress, _RemotePort);//定義遠程發送組播消息端點信息 while (_IsMulticast) {   byte[] recvBuffer = _UdpClient.Receive(ref ipeRemote);//接收組播組數據 if (recvBuffer != null) { string recvStr = Encoding.UTF8.GetString(recvBuffer);//轉為字符串   string jsonStr = ToJson(recvStr);//將接收的字符串轉為標准json字符串 Multicast multicast = ConvertHelper.JsonToModel<Multicast>(jsonStr);//調用封裝Newtosoft函數轉實體類 TriggerOnUdpMulticast(multicast);//觸發事件方法 } Thread.Sleep(500);//休眠 } } catch (Exception ex) { LogManager.log(ex.StackTrace); } }); taskUdp.Start();
 //觸發事件方法

  private void TriggerOnUdpMulticast(Multicast msg)
  {
    OnUdpMulticast?.Invoke(msg);
  } 

 //接收到的組播消息為非標准json,缺少大括號和雙引號,這里做轉換處理(根據實際消息處理)

  private string ToJson(string msg)
  {
    if (!msg.StartsWith("^") || !msg.EndsWith("$"))
      return string.Empty;
     msg = msg.TrimStart('^').TrimEnd('$').ToUpper();
    string[] paramArray = msg.Split(',');
    StringBuilder sbJson = new StringBuilder();
    foreach (string text in paramArray)
    {
      string[] keyValue = text.Trim().Split(':');
      string key;
      if (keyValue.Length != 2 || (key = keyValue[0]) == null)
        return string.Empty;
      sbJson.Append($"\"{key}\":\"{keyValue[1]}\",");
    }
    sbJson.Remove(sbJson.Length - 1, 1);
    string jsonStr = $"{{{sbJson.ToString()}}}";
    return jsonStr;
  }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM