程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#若何主動選擇出體系中最適合的IP地址

C#若何主動選擇出體系中最適合的IP地址

編輯:C#入門知識

C#若何主動選擇出體系中最適合的IP地址。本站提示廣大學習愛好者:(C#若何主動選擇出體系中最適合的IP地址)文章只能為提供參考,不一定能成為您想要的結果。以下是C#若何主動選擇出體系中最適合的IP地址正文


寫這個是由於很長時光以來,碰著過許多次這個成績,但都沒當回事,此次又碰著了這個老成績,無法百度了一圈兒未果,身旁又沒有年夜牛可以就教,就本身先“總結”了一套辦法,一來給本身記載,二來假如恰巧能有同伙看到並為他處理了異樣的困擾我將覺得很爽。

原由:但凡收集法式,Coder仿佛弗成防止要碰著,你的代碼若何在分歧的機械上遴選出最適合的誰人IP來通信,由於假如翻開一個運用法式讓用戶來選擇用哪一個IP地址和端口來通信仿佛就代表著這是個何等低真個法式,何等低能的法式員,所以必定要主動選擇,用戶 0 感知,就像巨大的QQ那樣。我也再次碰著了這個工作,Q群未果百度未果,就本身用 Framework 中供給的辦法和屬性,本身總結了一個“規矩”,上面直奔主題。

如今的機械能夠是雙網卡,能夠由於各類軟件和驅動又有多個虛擬網卡,所以我的“規矩”是不直接斷定 IP 是否是相符劃定,而是先從 NetworkInterface 動手,上面總結一下:

  1. 獲得一切當地 NetworkInterface 對象;

  2. 其屬性 Type 最好為 Wireless80211、Ethernet、Fddi、Ppp等,由於依據 MSDN 的說明這幾類會是通俗家用電腦罕見的接口類型,但如許斷定不太精確,所以只作為幫助斷定前提;

  3. 其屬性 OperationalStatus 應當為 Up,依據 MSDN 說明,僅在 Up 時表現該收集接口是可以正常收發數據的,這也能夠作為斷定網卡(收集)能否可用的一個前提;

  4. 應用 GetIPProperties().UnicastAddresses 辦法,獲得該收集接口下一切單播地址,這可讓你取得收集IP;

  5. 該IP的DuplicateAddressDetectionState屬性應當為 Preferred,表現地址有用,即IP地址可正常應用;

  6. 該IP的屬性 PrefixOrigin 其值應當為 Dhcp 或 Manual,表現IP前綴由 Dhcp 分派或手動指定;

  7. 該IP的屬性 SuffixOrigin 其值應當為 OriginDhcp 或 Manual,表現IP後綴由 DHCP 分派或手動指定;

  綜上所述,根本可以消除一些如 169 、127.0.0.1 等此類的特別地址,還有一些雜亂無章不知有甚麼用的收集接口(有的收集接口沒有地址,有的只要IPV6地址),但我感到我這辦法應當不是個“正途”,願望能有有經歷的人看到給我指導迷津。

  以下貼出測試用的截圖和代碼,是我機械上的成果:

代碼:

var interfaceList = NetworkInterface.GetAllNetworkInterfaces();
      StringBuilder sb = new StringBuilder(512);
      int index = 0;
      string message = string.Empty;

      foreach(var item in interfaceList)
      {
        index++;

        sb.AppendLine(string.Format("Interface{0}: {1}", index, item.Name));
        sb.AppendLine(string.Format("Description: {0}", item.Description));
        sb.AppendLine(string.Format("ID: {0}", item.Id));
        sb.AppendLine(string.Format("Type: {0}", item.NetworkInterfaceType));
        sb.AppendLine(string.Format("OperationalStatus: {0}", item.OperationalStatus));
        sb.AppendLine(string.Format("IsReceiveOnly: {0}", item.IsReceiveOnly));
        sb.AppendLine(string.Format("Speed: {0}", item.Speed));
        sb.AppendLine(string.Format("SupportMulticast: {0}", item.SupportsMulticast));
        sb.AppendLine(string.Format("SupportIPV4: {0}", item.Supports(NetworkInterfaceComponent.IPv4)));

        sb.AppendLine(string.Format("IP Properties:"));
        var addresses = item.GetIPProperties().UnicastAddresses;
        int j = 0;
        foreach (var ip in addresses)
        {
          j++;
          sb.AppendLine(string.Format("Address{0}: {1}({2})", j, ip.Address.ToString(),ip.Address.AddressFamily));
          sb.AppendLine(string.Format("IPV4 Mask: {0}", ip.IPv4Mask));
          sb.AppendLine(string.Format("PrefixOrigin: {0}", ip.PrefixOrigin));
          sb.AppendLine(string.Format("SuffixOrigin: {0}", ip.SuffixOrigin));
          sb.AppendLine(string.Format("DuplicateAddressDetectionState: {0}", ip.DuplicateAddressDetectionState));
        }
        sb.AppendLine();
      }

      textBox1.Text = sb.ToString();

以上就是本文的全體內容,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved