獲取本機所有IP地址:
這些地址是包含所有網卡(虛擬網卡)的ipv4和ipv6地址。
1 string name = Dns.GetHostName(); 2 IPAddress[] ipadrlist = Dns.GetHostAddresses(name);
獲取本機所有IPV4地址:
1 string name = Dns.GetHostName(); 2 IPAddress[] ipadrlist = Dns.GetHostAddresses(name); 3 foreach (IPAddress ipa in ipadrlist) 4 { 5 if (ipa.AddressFamily == AddressFamily.InterNetwork) 6 Console.Writeline(ipa.ToString()); 7 }
若要單單獲取ipv4地址,可以用IPAdress.AddressFamily 屬性判斷:對於 IPv4,返回 InterNetwork;對於 IPv6,返回 InterNetworkV6。
然而如果本機可能有多個ipv4的地址,那如何獲取訪問默認網關時使用的網卡IP呢。在CSDN論壇找到了大神的方法,用的是查詢本機路由表。
獲取本機正在使用的ipv4地址(訪問互聯網的IP)
可別小看,還是有很多需要考慮的:
1.一個電腦有多個網卡,有線的、無線的、還有vmare虛擬的兩個網卡。
2.就算只有一個網卡,但是該網卡配置了N個IP地址.其中還包括ipv6地址。
1 /// <summary> 2 /// 獲取當前使用的IP 3 /// </summary> 4 /// <returns></returns> 5 public static string GetLocalIP() 6 { 7 string result = RunApp("route", "print",true); 8 Match m = Regex.Match(result, @"0.0.0.0\s+0.0.0.0\s+(\d+.\d+.\d+.\d+)\s+(\d+.\d+.\d+.\d+)"); 9 if (m.Success) 10 { 11 return m.Groups[2].Value; 12 } 13 else 14 { 15 try 16 { 17 System.Net.Sockets.TcpClient c = new System.Net.Sockets.TcpClient(); 18 c.Connect("www.baidu.com", 80); 19 string ip = ((System.Net.IPEndPoint)c.Client.LocalEndPoint).Address.ToString(); 20 c.Close(); 21 return ip; 22 } 23 catch (Exception) 24 { 25 return null; 26 } 27 } 28 } 29 30 /// <summary> 31 /// 獲取本機主DNS 32 /// </summary> 33 /// <returns></returns> 34 public static string GetPrimaryDNS() 35 { 36 string result = RunApp("nslookup", "",true); 37 Match m = Regex.Match(result, @"\d+\.\d+\.\d+\.\d+"); 38 if (m.Success) 39 { 40 return m.Value; 41 } 42 else 43 { 44 return null; 45 } 46 } 47 48 /// <summary> 49 /// 運行一個控制台程序並返回其輸出參數。 50 /// </summary> 51 /// <param name="filename">程序名</param> 52 /// <param name="arguments">輸入參數</param> 53 /// <returns></returns> 54 public static string RunApp(string filename, string arguments,bool recordLog) 55 { 56 try 57 { 58 if (recordLog) 59 { 60 Trace.WriteLine(filename + " " + arguments); 61 } 62 Process proc = new Process(); 63 proc.StartInfo.FileName = filename; 64 proc.StartInfo.CreateNoWindow = true; 65 proc.StartInfo.Arguments = arguments; 66 proc.StartInfo.RedirectStandardOutput = true; 67 proc.StartInfo.UseShellExecute = false; 68 proc.Start(); 69 70 using (System.IO.StreamReader sr = new System.IO.StreamReader(proc.StandardOutput.BaseStream, Encoding.Default)) 71 { 72 //string txt = sr.ReadToEnd(); 73 //sr.Close(); 74 //if (recordLog) 75 //{ 76 // Trace.WriteLine(txt); 77 //} 78 //if (!proc.HasExited) 79 //{ 80 // proc.Kill(); 81 //} 82 //上面標記的是原文,下面是我自己調試錯誤后自行修改的 83 Thread.Sleep(100); //貌似調用系統的nslookup還未返回數據或者數據未編碼完成,程序就已經跳過直接執行 84 //txt = sr.ReadToEnd()了,導致返回的數據為空,故睡眠令硬件反應 85 if (!proc.HasExited) //在無參數調用nslookup后,可以繼續輸入命令繼續操作,如果進程未停止就直接執行 86 { //txt = sr.ReadToEnd()程序就在等待輸入,而且又無法輸入,直接掐住無法繼續運行 87 proc.Kill(); 88 } 89 string txt = sr.ReadToEnd(); 90 sr.Close(); 91 if (recordLog) 92 Trace.WriteLine(txt); 93 return txt; 94 } 95 } 96 catch (Exception ex) 97 { 98 Trace.WriteLine(ex); 99 return ex.Message; 100 } 101 }
另有一種方法通過用ipconfig來獲取:
1 private void GetIP() 2 { 3 Process cmd = new Process(); 4 cmd.StartInfo.FileName = "ipconfig.exe";//設置程序名 5 cmd.StartInfo.Arguments = "/all"; //參數 6 //重定向標准輸出 7 cmd.StartInfo.RedirectStandardOutput = true; 8 cmd.StartInfo.RedirectStandardInput = true; 9 cmd.StartInfo.UseShellExecute = false; 10 cmd.StartInfo.CreateNoWindow = true;//不顯示窗口(控制台程序是黑屏) 11 //cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//暫時不明白什么意思 12 /* 13 收集一下 有備無患 14 關於:ProcessWindowStyle.Hidden隱藏后如何再顯示? 15 hwndWin32Host = Win32Native.FindWindow(null, win32Exinfo.windowsName); 16 Win32Native.ShowWindow(hwndWin32Host, 1); //先FindWindow找到窗口后再ShowWindow 17 */ 18 cmd.Start(); 19 string info = cmd.StandardOutput.ReadToEnd(); 20 cmd.WaitForExit(); 21 cmd.Close(); 22 textBox1.AppendText(info); 23 }