如何在Android中扫描IP [英] How to scan IP in Android

查看:271
本文介绍了如何在Android中扫描IP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个简单"应用程序,它将找到给定网络中的所有IP地址.

I want to create a "simple" app that will find all IP addresses in a given network..

例如...

我有一个按钮,单击该按钮时,找到所有IP地址并将其显示在ListView中.

I have a button that when clicked, find all IP addresses and display them in a ListView..

有人有我可以解释怎么做的示例或功能源代码吗?

Does anyone have an example or functional source code that I can explain how to do ?

对不起,我的英语=)

推荐答案

这是我的代码,用于在本地网络中查找IP地址. 首先,您必须找到设备的IP地址,然后使用该IP地址的subnet ping每个IP地址.假设设备ip地址为192.168.0.100,则本地subnet192.168.0..然后从192.168.0.1192.168.0.255 ping每个IP地址以查找设备的IP地址,可以使用两种方法: 1方法:

This is my code for finding IP addresses in local network. First you have to find your device IP Address then ping each ip addresses using subnetof that ip address. Suppose device ip address is 192.168.0.100 then local subnet is 192.168.0.. and then ping each IP addresses from 192.168.0.1 to 192.168.0.255 for finding ip address of device you can use two method: 1 Method:

    String ip = "";
      Enumeration<NetworkInterface> enumNetworkInterfaces =  NetworkInterface.getNetworkInterfaces();

           while(enumNetworkInterfaces.hasMoreElements())
           {
            NetworkInterface networkInterface = enumNetworkInterfaces.nextElement();
     Enumeration<InetAddress> enumInetAddress = networkInterface.getInetAddresses();

      while(enumInetAddress.hasMoreElements())
            {
             InetAddress inetAddress = enumInetAddress.nextElement();
    String ipAddress = "";
    if(inetAddress.isSiteLocalAddress())
             {
              ipAddress = "SiteLocalAddress: ";
    }
     ip += ipAddress + inetAddress.getHostAddress() + "\n";
String subnet = getSubnetAddress(ip);

private String getSubnetAddress(int address) 
     {
         String ipString = String.format(
                   "%d.%d.%d",
                   (address & 0xff),
                   (address >> 8 & 0xff),
                   (address >> 16 & 0xff));

                   return ipString;
     }

2方法:

 WifiManager mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiInfo  mWifiInfo = mWifiManager.getConnectionInfo();
String subnet = getSubnetAddress(mWifiManager.getDhcpInfo().gateway);

找到子网地址后,对网络中的每个IP地址执行ping操作

After finding subnet address, ping each IP addresses in network:

 private void checkHosts(String subnet)
     {
         try 
         {
             int timeout=5;
             for (int i=1;i<255;i++)
             {
                 String host=subnet + "." + i;
                 if (InetAddress.getByName(host).isReachable(timeout))
                 {
                     Log.d(TAG, "checkHosts() :: "+host + " is reachable");
                 }
             }
         }
         catch (UnknownHostException e) 
         {
             Log.d(TAG, "checkHosts() :: UnknownHostException e : "+e);
             e.printStackTrace();
         } 
         catch (IOException e) 
         {
             Log.d(TAG, "checkHosts() :: IOException e : "+e);
             e.printStackTrace();
         }
    }

ping每个IP地址后,android内核文件存储了网络中的IP地址.您可以通过调用AndroidOS文件来获取此列表.这个文件是arp,它存储在android的/proc/net/中.您可以通过代码进入.只需以编程方式执行特定命令并存储在您的modelData中,然后通过适配器通知您的listView:

After pinging each IP Addresses then android kernel file stored those IP address who are in networks. You can get this list by calling AndroidOS file. This file is arp which is stored in /proc/net/ in android. You can get in through the code. Just execute particular command programatically and stored in your modelData then notify your listView Through Adapter:

ArrayList<IpAddress> mIpAddressesList;
    private boolean getIpFromArpCache() 
         {
             BufferedReader br = null;
             char buffer[] = new char[65000];
             String currentLine;
             try 
             {
                 br = new BufferedReader(new FileReader("/proc/net/arp"));

                 while ((currentLine = br.readLine()) !=  null) 
                 {
                     Log.d(TAG, "getIpFromArpCache() :: "+ currentLine);

                     String[] splitted = currentLine.split(" +");
                     if (splitted != null && splitted.length >= 4) 
                     {
                        String ip = splitted[0];
                        String mac = splitted[3];
                        if (!splitted[3].equals(emptyMac)) 
                        {
                            if (!splitted[0].equals(IP)) 
                            {
    //                          int remove = mac.lastIndexOf(':');
    //                          mac = mac.substring(0,remove) + mac.substring(remove+1);
                                mac = mac.replace(":", "");
                                Log.i(TAG, "getIpFromArpCache() :: ip : "+ip+" mac : "+mac);
                                mIpAddressesList.add(new IpAddress(ip, mac));
                            }
                        }
                     }

                 }

                 return true;

             } 
             catch (Exception e) 
             {
                 e.printStackTrace();
             } 
             finally 
             {
                 try 
                 {
                     br.close();
                 } 
                 catch (IOException e) 
                 {
                     e.printStackTrace();
                 }
             }
             return false;
         }



public class IpAddress 
{
    private String ipAddressName;
    private String macAddress;


    public IpAddress(String ipAddressName, String macAddress) 
    {
        setIpAddressName(ipAddressName);
        setMacAddress(macAddress);
    }

    public void setIpAddressName(String ipAddressName) 
    {
        this.ipAddressName = ipAddressName;
    }

    public String getIpAddressName() 
    {
        return this.ipAddressName;
    }


    public void setMacAddress(String macAddress) 
    {
        this.macAddress = macAddress;
    }


    public String getMacAddress() 
    {
        return this.macAddress;
    }
}

但是对于在主线程上执行这些联网操作并不好.您必须将所有代码推送到线程上.并在后台线程上执行所有与网络相关的问题.希望对您有帮助.让我知道天气是否有效. 如果您需要,我想分享此演示的.apk.

But for performing these networking operation on main thread is not good. You have to push all code on thread. and perform all network related isses on background thread. Hope it helps you. let me know weather it works or not. If you need I would like to share .apk of this demo.

这篇关于如何在Android中扫描IP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆