最近協助一個項目解決了一個獲取IP地址的問題,手機客戶端與WebService進行通訊,然后WebService通過TCP通訊把指令傳遞到另一台PC機上。在測試的過程中,總是會出現WebService服務器和PC機通訊失敗的問題,但是用TCP調試工具進行通訊調試這兩台機器是可以進行通訊的,進行調試好了之后,換了另外的網絡環境又通訊不了。最后拿到了代碼,排查出來是IP地址獲取的問題。
原始代碼獲取IP地址是通過Dns.GetHostAddresses(Dns.GetHostName())進行獲取IP地址數組,然后再數組中獲取IP地址的:
原來寫的代碼獲取的是數組中的第三個值,在其中寫死,在測試環境上就已經測試通過,但是換了客戶環境通訊又失敗,無奈用Fildder進行排查,通訊的地址有問題,就排查到IP地址獲取錯誤,通過網上查找資料,獲取IP地址換成:
1 public static IPAddress localip = Dns.GetHostAddresses(Dns.GetHostName()) 2 .Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 3 .First();
Dns.GetHostAddresses(Dns.GetHostName())中獲取IP地址為IPV4、IPV6,多塊網卡(包括虛擬網卡)的地址,網絡環境不同,獲取的數據就不一樣,導致獲取本機IP地址出現錯誤。
在對IP地址進行篩選
1 Dns.GetHostAddresses(MachineName) 2 .Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 3 .First()
是篩選ip v4 。
1 Dns.GetHostAddresses(MachineName) 2 .Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) 3 .First()
是篩選V6的ip地址。