zoukankan      html  css  js  c++  java
  • 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.0s+0.0.0.0s+(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     }  
  • 相关阅读:
    2019-8-31-C#-控制台使用-UAC-权限
    2019-8-31-C#-控制台使用-UAC-权限
    2018-8-10-WPF-程序生成类库错误
    2018-8-10-WPF-程序生成类库错误
    2018-11-8-WPF-获取下载内容长度
    2018-11-8-WPF-获取下载内容长度
    2018-11-19-win10-uwp-使用-AppCenter-自动构建
    2018-11-19-win10-uwp-使用-AppCenter-自动构建
    Java实现 LeetCode 560 和为K的子数组(某著名排序大法改编)
    Java实现 LeetCode 560 和为K的子数组(某著名排序大法改编)
  • 原文地址:https://www.cnblogs.com/lijianda/p/6604651.html
Copyright © 2011-2022 走看看