金沙澳门官网7817网址:C#获得本机IP地址(ipv4)

2. CPP文件(代码应用演示),1. 头文件(包含特征处理函数),蜂窝网卡拥有一个IPv4地址来访问外网,而且同一个网卡也可能拥有不止一个IP地址,获取本机正在使用的ipv4地址(访问互联网的IP),然而如果本机可能有多个ipv4的地址,掩码和广播地址实例代码的全部内容,掩码和广播地址

简介

在Socket编制程序的时候,我们必要实时获取大家所须求的IP地址。例如在编辑后门的时候,大家大概要求得到有效的外网IP或内网IP;有时候大家也许须求看清我们赢得的是还是不是是虚拟机网卡,那时候就需求对每一张网卡上的风味实行辨认。以下作者总括了部分常用的拍卖措施供我们参考。

参考资料:1.
领到网卡音信情势
              2.
虚构与物理网卡区分方法

三. 基本可行的艺术

    public static String getIpAddressString() {
        try {
            for (Enumeration<NetworkInterface> enNetI = NetworkInterface
                    .getNetworkInterfaces(); enNetI.hasMoreElements(); ) {
                NetworkInterface netI = enNetI.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = netI
                        .getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) {
                        return inetAddress.getHostAddress();
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return "";
    }

格局执行所需权限为:

<uses-permission android:name="android.permission.INTERNET"/>

那段代码简单精晓,其实便是双重循环获取极限中颇具网络接口的保有IP地址,然后回来第2个遇到的非当地回环的IPv四地址。那种办法得以很好的遮盖大家一般的急需。依照Android系统的运转搭飞机制,当WiFi互联网开启时蜂窝网络会自行关闭,因而遍历到的第一个地方是WiFi网卡的IP地址;同样,当关闭WiFi网络,打开蜂窝网络时,遍历到的率先个地方是蜂窝网卡的IP地址。

那么,为何小编叫那种办法为着力可行的法子吗,因为它回到的结果并不是百分百“正确”的,确切地说并不一定是开发职员想要的结果。比如当Android手提式有线电话机开启热点的时候,实际上是经过WiFi网卡共享其蜂窝互联网,由此此时,WiFi网卡和蜂窝网卡分配了差异的IP地址,但出于蜂窝网卡对应的NetworkInterface对象出现的职位要先于WiFi网卡,因而该方法重临的实在是蜂窝网卡的IP地址。假设想要始终获得WiFi网卡的IP地址能够在上述的四个循环间添加如下筛选代码:

if (netI.getDisplayName().equals("wlan0") || netI.getDisplayName().equals("eth0"))

当中”wlan0″和”eth0″为广大的WLAN网卡的DisplayName名称,绝一大半为”wlan0″,相比老的机型恐怕会是”eth0″或任何。

此处只是举了一个粗略的例证,其实还有许多特有的动静,比如敞开USB互联网共享的气象、开启网络代理的气象、从前涉嫌的哈克er手段同时开辟蜂窝网络和WiFi互联网(非WiFi热点)的图景等等,这一个网络环境下都会存在多IP的情况,由此该措施不肯定完全适用了。

正如小说伊始所说,由于二个Android设备同方今刻恐怕不唯有五个IP地址,由此得以说并没有其余一段通用的代码能赢得各样人心中想要获取的IP地址,主要的依然遵照自个儿现实的须要来开展相应的代码修改,通过对获取的IP地址列表进行筛选来取得想要的结果。

正文的座谈是围绕IPv4地址的,要是想要获取IPv陆地址,Android
API也提供了对应的类或形式,只须要在上述代码的根基上作出微小修改即可。

终极附上在StackOverFlow上看出的有关IP地址筛选的总结,供我们参考。

  • Any address in the range 127.xxx.xxx.xxx is a “loopback” address.
    It is only visible to “this” host.
  • Any address in the range 192.168.xxx.xxx is a private (aka site
    local) IP address. These are reserved for use within an
    organization. The same applies to 10.xxx.xxx.xxx addresses, and
    172.16.xxx.xxx through 172.31.xxx.xxx.
  • Addresses in the range 169.254.xxx.xxx are link local IP
    addresses. These are reserved for use on a single network segment.
  • Addresses in the range 224.xxx.xxx.xxx through 239.xxx.xxx.xxx are
    multicast addresses.
  • The address 255.255.255.255 is the broadcast address.
  • Anything else should be a valid public point-to-point IPv4
    address.

文中全部代码可以在个人github主页翻开和下载。

另,私家技术博客,同步更新,欢迎关心!转发请评释出处!文中若有哪些错误希望我们研究指正!

赢得本机全部IPV四地址:

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

        若要单单获取ipv四地址,可以用IPAdress.AddressFamily
属性判断:对于 IPv4,重临 InterNetwork;对于 IPv六,重回 InterNetworkV陆。

       
然则就算本机恐怕有四个ipv四的地址,这什么获得访问暗中认可网关时使用的网卡IP呢。在CSDN论坛找到了大神的秘籍,用的是询问本机路由表。

得到本机正在利用的ipv四地址(访问互连网的IP),可别小看,照旧有无数急需思索的:
壹.三个计算机有两个网卡,有线的、有线的、还有vmare虚拟的五个网卡。
二.即使唯有3个网卡,可是该网卡配置了N个IP地址.在这之中还包罗ipv陆地址。

下边贴2个自家一贯使用的法子,它经过查询本机路由表,获取访问私下认可网关时使用的网卡IP。
用了贰年了,屡试不爽。

      /// <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);  
    }

金沙澳门官网7817网址 1

此时就要本身入手看什么截取了。可参看上面大神怎样用正则表明式来合营。

搜了一天,竟然没找到一段合适的代码来获得机器中有所网卡的ip,掩码和播发地址,大部分都以用socket,不过socket平时再次来到的要不就是内网地址,要不正是公网地址,不可见找到全体地点,真的太忧桑了,决定本人通过ifconfig或ipconfig的回来新闻,一步步地过滤了。此番的代码重要选拔了正则表达式和subprocess模块,而且为了合作全体平台(win,linux和mac),也应用了platform来判断系统项目,不说太多,代码如下:

C++代码样例

直白以来,好像未有1段正式的代码能提供Android设备此时的IP地址,究其原因,Android设备的网卡大概不只二个,如蜂窝网卡、WiFi网卡,而且同三个网卡也恐怕全体持续2个IP地址。基于此,1个Android终端很有极大大概还要负有多个IP地址(不只是同时具备IPv4和IPv6地址),比如敞开热点共享蜂窝互联网的时候,蜂窝网卡拥有一个IPv四地址来走访外网,WiFi网卡拥有2个IPv4地址来作为内网的网关。

取得本机全部IP地址:

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

         那个地点是包蕴全数网卡(虚拟网卡)的ipv四和ipv6地址。

本文首要商量的是运用Python获取本机全数网卡ip,掩码和播音地址,分享了有关的实例代码,具体介绍如下。