HI 各位大大好
想請問要怎麼用C#正確的取得主機的IP
目前的寫法是這樣
string ipaddress = "";
IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
ipaddress = hostEntry.AddressList.ToList().Where(p => p.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).FirstOrDefault().ToString();
return ipaddress;
但是這會有一個問題
因為我在我的電腦有裝virtual box 和 docker
所以我的 ipconfig 內容如下
我預期應該要取到 10.x.x.212這個IP
但hostEntry.AddressList.ToList()
的順序會讓我取到 192.x.x.97
怎麼樣能夠正確的過濾虛擬網路卡呢?
有試過
System.Net.Sockets.TcpClient c = new System.Net.Sockets.TcpClient();
c.Connect("www.google.com", 80);
string ip = ((System.Net.IPEndPoint)c.Client.LocalEndPoint).Address.ToString();
c.Close();
return ip;
的確可以正確取到,但這個的前提是主機要可以建立連線,內部系統的主機通常都不會開放 80 443,所以這個方法不可行
也有查到在程式裡面開終端機查route過濾出自己要的資料,但是不同平台的指令不同
所以想問問有沒有更好的寫法
using System.Net;
String strHostName = Dns.GetHostName(); //先讀取本機名稱
IPHostEntry iphostentry = Dns.GetHostByName(strHostName);
//取得本機的 IpHostEntry 類別實體
string ip="";
foreach (IPAddress ipaddress in iphostentry.AddressList)
{
Console.WriteLine(ipaddress.ToString()); //使用了兩種方式都可以讀取出IP位置
ip = ip+ipaddress.ToString();
string localIP = Dns.GetHostEntry(hostName).AddressList[0].ToString();
HI 小魚兒 大大你好
這篇我也有看過
這個就是在程式裡把終端機跑起來查route然後再過濾出自己要的資料,但是因為寫好的程式(.net core)有可能不是在windows上面跑,windows、mac os 、linux等等,所以暫時沒有考慮這個寫法ˊˋ
string localIP = Dns.GetHostEntry(hostName).AddressList[0].ToString();
這個沒有指定AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
的話,會抓出IPV6的位址QQ
曾經用proxy後,要取真實ip的痛苦經驗。
其實情況跟你目前雖不太一樣,但基本問題則是大同小異。
我將當時研究想到的招式分享給你。你搞不好可以用這一招。
我當時用的就是排除法。
因為proxy都是在固定的網段。
我取出所有拿到的ip。排除proxy跟cdn的網段ip。
剩下來的就大多是真實ip了。
依你的情況搞不好會更容易處理。
因為你只是用了virtual box 和 docker
這些大多是分配了私域ip。192.168.x.x。
只要將私域ip過排除掉就行了。