iT邦幫忙

0

取得主機IP

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 內容如下
https://ithelp.ithome.com.tw/upload/images/20200603/20120596EdFT7jfg8s.png

我預期應該要取到 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過濾出自己要的資料,但是不同平台的指令不同
所以想問問有沒有更好的寫法

2 個回答

1
小魚兒
iT邦新手 5 級 ‧ 2020-06-03 17:34:24

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();

看更多先前的回應...收起先前的回應...
ice bear iT邦新手 5 級 ‧ 2020-06-03 17:39:27 檢舉

大大你好 我目前的寫法是這樣
但是iphostentry.AddressList會列出所有的網卡
包含虛擬的(virtual box 和 docker)

小魚兒 iT邦新手 5 級 ‧ 2020-06-04 08:42:05 檢舉
小魚兒 iT邦新手 5 級 ‧ 2020-06-04 08:42:45 檢舉

string localIP = Dns.GetHostEntry(hostName).AddressList[0].ToString();

ice bear iT邦新手 5 級 ‧ 2020-06-04 09:14:31 檢舉

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

0
浩瀚星空
iT邦超人 1 級 ‧ 2020-06-04 10:00:03

曾經用proxy後,要取真實ip的痛苦經驗。
其實情況跟你目前雖不太一樣,但基本問題則是大同小異。

我將當時研究想到的招式分享給你。你搞不好可以用這一招。
我當時用的就是排除法。

因為proxy都是在固定的網段。
我取出所有拿到的ip。排除proxy跟cdn的網段ip。
剩下來的就大多是真實ip了。

依你的情況搞不好會更容易處理。
因為你只是用了virtual box 和 docker
這些大多是分配了私域ip。192.168.x.x。
只要將私域ip過排除掉就行了。

ice bear iT邦新手 5 級 ‧ 2020-06-05 10:08:19 檢舉

好的! 了解了
謝謝大大!!

我要發表回答

立即登入回答