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();
以上就是本文的全體內容,願望對年夜家的進修有所贊助。