C#獲取本機IP地址(ipv4)


獲取本機所有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     }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM