C#如何自動選擇出系統(tǒng)中最合適的IP地址
寫這個是因為很長時間以來,碰到過很多次這個問題,但都沒當(dāng)回事,這次又碰到了這個老問題,無奈百度了一圈兒未果,身邊又沒有大??梢哉埥蹋妥约合取翱偨Y(jié)”了一套方法,一來給自己記錄,二來如果碰巧能有朋友看到并為他解決了同樣的困擾我將感到很爽。
起因:凡是網(wǎng)絡(luò)程序,Coder似乎不可避免要碰到,你的代碼如何在不同的機(jī)器上挑選出最合適的那個IP來通訊,因為如果打開一個應(yīng)用程序讓用戶來選擇用哪個IP地址和端口來通訊似乎就代表著這是個多么低端的程序,多么低能的程序員,所以一定要自動選擇,用戶 0 感知,就像偉大的QQ那樣。我也再次碰到了這個事情,Q群未果百度未果,就自己用 Framework 中提供的方法和屬性,自己總結(jié)了一個“規(guī)則”,下面直奔主題。
現(xiàn)在的機(jī)器可能是雙網(wǎng)卡,可能因為各類軟件和驅(qū)動又有多個虛擬網(wǎng)卡,所以我的“規(guī)則”是不直接判斷 IP 是不是符合規(guī)定,而是先從 NetworkInterface 入手,下面總結(jié)一下:
1. 獲取所有本地 NetworkInterface 對象;
2. 其屬性 Type 最好為 Wireless80211、Ethernet、Fddi、Ppp等,因為根據(jù) MSDN 的解釋這幾類會是普通家用電腦常見的接口類型,但這樣判斷不太準(zhǔn)確,所以只作為輔助判斷條件;
3. 其屬性 OperationalStatus 應(yīng)該為 Up,根據(jù) MSDN 解釋,僅在 Up 時表示該網(wǎng)絡(luò)接口是可以正常收發(fā)數(shù)據(jù)的,這也可以作為判斷網(wǎng)卡(網(wǎng)絡(luò))是否可用的一個條件;
4. 使用 GetIPProperties().UnicastAddresses 方法,獲取該網(wǎng)絡(luò)接口下所有單播地址,這可以讓你獲得網(wǎng)絡(luò)IP;
5. 該IP的DuplicateAddressDetectionState屬性應(yīng)該為 Preferred,表示地址有效,即IP地址可正常使用;
6. 該IP的屬性 PrefixOrigin 其值應(yīng)該為 Dhcp 或 Manual,表示IP前綴由 Dhcp 分配或手動指定;
7. 該IP的屬性 SuffixOrigin 其值應(yīng)該為 OriginDhcp 或 Manual,表示IP后綴由 DHCP 分配或手動指定;
綜上所述,基本可以排除一些如 169 、127.0.0.1 等此類的特殊地址,還有一些亂七八糟不知有什么用的網(wǎng)絡(luò)接口(有的網(wǎng)絡(luò)接口沒有地址,有的只有IPV6地址),但我感覺我這方法應(yīng)該不是個“正路”,希望能有有經(jīng)驗的人看到給我指點迷津。
以下貼出測試用的截圖和代碼,是我機(jī)器上的結(jié)果:
代碼:
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();
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
C#后端接收form-data,創(chuàng)建實體類教程
這篇文章主要介紹了C#后端接收form-data,創(chuàng)建實體類教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06C#使用MailAddress類發(fā)送html格式郵件的實例代碼
這篇文章主要介紹如何使用C#的MailAddress類發(fā)送郵件的方法,大家參考使用吧2013-11-11HttpWebRequest出錯.Section=ResponseHeader Detail=CR
HttpWebRequest出錯.Section=ResponseHeader Detail=CR...2007-03-03C#編程實現(xiàn)Excel文檔中搜索文本內(nèi)容的方法及思路
有了在Word文檔中編程實現(xiàn)搜索文本的經(jīng)驗,在Excel中實現(xiàn)這個功能也并非難事。2013-07-07