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     }  

 

posted on 2017-03-23 13:32  LJD泊水  阅读(59450)  评论(3编辑  收藏  举报