• 技术文章 >后端开发 >C#.Net教程

    详解C#获取本机IP地址(ipv4)的代码案例

    黄舟黄舟2017-03-24 11:37:53原创2814

    本文主要介绍了C#获取本机所有IP地址的方法、C#获取本机IP地址(ipv4)的方法等。具有很好的参考价值。下面跟着小编一起来看下吧

    获取本机所有IP地址:

    这些地址是包含所有网卡(虚拟网卡)的ipv4和ipv6地址。

     string name = Dns.GetHostName(); 
     IPAddress[] ipadrlist = Dns.GetHostAddresses(name);

    获取本机所有IPV4地址:

    string name = Dns.GetHostName(); 
    IPAddress[] ipadrlist = Dns.GetHostAddresses(name); 
    foreach (IPAddress ipa in ipadrlist) 
    { 
      if (ipa.AddressFamily == AddressFamily.InterNetwork) 
      Console.Writeline(ipa.ToString()); 
    }

    若要单单获取ipv4地址,可以用IPAdress.AddressFamily 属性判断:对于 IPv4,返回 InterNetwork;对于 IPv6,返回 InterNetworkV6。

    然而如果本机可能有多个ipv4的地址,那如何获取访问默认网关时使用的网卡IP呢。在CSDN论坛找到了大神的方法,用的是查询本机路由表。

    获取本机正在使用的ipv4地址(访问互联网的IP)

    可别小看,还是有很多需要考虑的:

    1.一个电脑有多个网卡,有线的、无线的、还有vmare虚拟的两个网卡。

    2.就算只有一个网卡,但是该网卡配置了N个IP地址.其中还包括ipv6地址。

    /// <summary> 
     /// 获取当前使用的IP 
     /// </summary> 
     /// <returns></returns> 
     public static string GetLocalIP() 
     { 
     string result = RunApp("route", "print",true); 
     Match m = Regex.Match(result, @"0.0.0.0\s+0.0.0.0\s+(\d+.\d+.\d+.\d+)\s+(\d+.\d+.\d+.\d+)"); 
     if (m.Success) 
     { 
      return m.Groups[2].Value; 
     } 
     else 
     { 
      try 
      { 
      System.Net.Sockets.TcpClient c = new System.Net.Sockets.TcpClient(); 
      c.Connect("www.baidu.com", 80); 
      string ip = ((System.Net.IPEndPoint)c.Client.LocalEndPoint).Address.ToString(); 
      c.Close(); 
      return ip; 
      } 
      catch (Exception) 
      { 
      return null; 
      } 
     } 
     } 
     /// <summary> 
     /// 获取本机主DNS 
     /// </summary> 
     /// <returns></returns> 
     public static string GetPrimaryDNS() 
     { 
     string result = RunApp("nslookup", "",true); 
     Match m = Regex.Match(result, @"\d+\.\d+\.\d+\.\d+"); 
     if (m.Success) 
     { 
      return m.Value; 
     } 
     else 
     { 
      return null; 
     } 
     } 
     /// <summary> 
     /// 运行一个控制台程序并返回其输出参数。 
     /// </summary> 
     /// <param name="filename">程序名</param> 
     /// <param name="arguments">输入参数</param> 
     /// <returns></returns> 
     public static string RunApp(string filename, string arguments,bool recordLog) 
     { 
     try 
     { 
      if (recordLog) 
      { 
      Trace.WriteLine(filename + " " + arguments); 
      } 
      Process proc = new Process(); 
      proc.StartInfo.FileName = filename; 
      proc.StartInfo.CreateNoWindow = true; 
      proc.StartInfo.Arguments = arguments; 
      proc.StartInfo.RedirectStandardOutput = true; 
      proc.StartInfo.UseShellExecute = false; 
      proc.Start(); 
      using (System.IO.StreamReader sr = new System.IO.StreamReader(proc.StandardOutput.BaseStream, Encoding.Default)) 
      { 
      //string txt = sr.ReadToEnd(); 
      //sr.Close(); 
      //if (recordLog) 
      //{ 
      // Trace.WriteLine(txt); 
      //} 
      //if (!proc.HasExited) 
      //{ 
      // proc.Kill(); 
      //} 
      //上面标记的是原文,下面是我自己调试错误后自行修改的 
      Thread.Sleep(100);  //貌似调用系统的nslookup还未返回数据或者数据未编码完成,程序就已经跳过直接执行 
          //txt = sr.ReadToEnd()了,导致返回的数据为空,故睡眠令硬件反应 
      if (!proc.HasExited)  //在无参数调用nslookup后,可以继续输入命令继续操作,如果进程未停止就直接执行 
      {    //txt = sr.ReadToEnd()程序就在等待输入,而且又无法输入,直接掐住无法继续运行 
       proc.Kill(); 
      } 
      string txt = sr.ReadToEnd(); 
      sr.Close(); 
      if (recordLog) 
       Trace.WriteLine(txt); 
      return txt; 
      } 
     } 
     catch (Exception ex) 
     { 
      Trace.WriteLine(ex); 
      return ex.Message; 
     } 
     }

    另有一种方法通过用ipconfig来获取:

    private void GetIP() 
     { 
     Process cmd = new Process(); 
     cmd.StartInfo.FileName = "ipconfig.exe";//设置程序名 
     cmd.StartInfo.Arguments = "/all"; //参数 
     //重定向标准输出 
     cmd.StartInfo.RedirectStandardOutput = true; 
     cmd.StartInfo.RedirectStandardInput = true; 
     cmd.StartInfo.UseShellExecute = false; 
     cmd.StartInfo.CreateNoWindow = true;//不显示窗口(控制台程序是黑屏) 
     //cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//暂时不明白什么意思 
     /* 
     收集一下 有备无患 
     关于:ProcessWindowStyle.Hidden隐藏后如何再显示? 
     hwndWin32Host = Win32Native.FindWindow(null, win32Exinfo.windowsName); 
     Win32Native.ShowWindow(hwndWin32Host, 1); //先FindWindow找到窗口后再ShowWindow 
     */ 
     cmd.Start(); 
     string info = cmd.StandardOutput.ReadToEnd(); 
     cmd.WaitForExit(); 
     cmd.Close(); 
     textBox1.AppendText(info); 
     }

    以上就是详解C#获取本机IP地址(ipv4)的代码案例的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:C# 获取 IP地址
    上一篇:C#中如何取绝对值函数的方法详解 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • c++输入输出语句有哪些• 指针数组和数组指针的区别是什么• 汇编语言和c语言的区别是什么• go是c语言中关键字吗• c语言文件读写怎么操作
    1/1

    PHP中文网