国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#如何自動選擇出系統中最合適的IP地址

2020-01-24 01:34:35
字體:
來源:轉載
供稿:網友

寫這個是因為很長時間以來,碰到過很多次這個問題,但都沒當回事,這次又碰到了這個老問題,無奈百度了一圈兒未果,身邊又沒有大牛可以請教,就自己先“總結”了一套方法,一來給自己記錄,二來如果碰巧能有朋友看到并為他解決了同樣的困擾我將感到很爽。

起因:凡是網絡程序,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();

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永德县| 景泰县| 寻乌县| 大化| 秭归县| 西昌市| 长丰县| 商南县| 大同市| 鹿泉市| 迁安市| 北宁市| 博客| 繁昌县| 雷山县| 沂源县| 简阳市| 合肥市| 汤原县| 连平县| 山丹县| 甘孜县| 房产| 阳山县| 西宁市| 措美县| 白朗县| 家居| 正镶白旗| 乐至县| 贵德县| 株洲市| 墨竹工卡县| 卓尼县| 图木舒克市| 扬州市| 宣城市| 伊通| 老河口市| 齐齐哈尔市| 鸡西市|