【问题标题】:Finding IP Addresses from Android从 Android 中查找 IP 地址
【发布时间】:2015-06-30 21:00:55
【问题描述】:

我正在尝试显示连接到当前 wifi 网络的所有设备的列表。

我面临的问题是,当我在 Java 上尝试以下代码(使用 DNS 查找)时,我看到了几个设备。 (这很好);但它不适用于我的安卓设备或模拟器。

有谁知道我做错了什么?我正在开发一个连接到 WiFi 的 Lolipop 电话。找到的唯一 IP 地址是本地主机。

byte[] ip = localhost.getAddress();
                for (int i = 0; i <= 254; i++)
                {
                    ip[3] = (byte)i;
                    InetAddress address = InetAddress.getByAddress(ip);
                    if (!address.getHostAddress().equals(address.getHostName() ) )
                    {
                        // machine is known in a DNS lookup
                           AvailableHostList.add(address);
                    }
                    else
                    {

                    }

【问题讨论】:

  • 要记住的一点是,在某些运营商(例如 Verizon)上,无线智能手机仅使用 IPv6(每个子网有超过 18 个 quintillion 地址)。我不相信任何运营商会让您发现网络上的其他设备,因为这是安全漏洞。我不确定他们如何处理 Wi-Fi,但我怀疑您是否可以在运营商的网络上执行此操作。
  • 对,我正在尝试在 Wi-Fi 上执行此操作(而不是在运营商网络上)。还有其他应用程序可以执行此操作,所以我知道这是可能的。
  • 好的。还要记住,IPv4 子网可以有可变数量的地址,而 IPv6 子网有如此之大的数量,以至于您需要数千年的时间才能通过蛮力检查它们。您应该检查 IPv4 中的子网大小以便您可以尝试检查,但我看到人们使用 10.0.0.0/8 这是不切实际的,并且商业 Wi-Fi 会阻止您检查子网上的任何其他地址。
  • 但是那样的话,在Java中不是不行吗?
  • 它是否有效取决于环境。 IPv4 的家庭 Wi-Fi 可能非常简单,除非它配置了一个大型子网。 IPv6 应该使用一些协议来发现邻居而不是暴力方法。即使在家庭 Wi-Fi 上,尤其是在商业网络上,您也可能无法发现任何邻居,因为一切都必须通过路由器,而路由器可能会欺骗您。这不是看起来那么简单的问题。在大多数基本配置的家庭 Wi-Fi 上工作的东西可能不适用于正确的 Wi-Fi 实施。

标签: android networking wifi ip-address hostname


【解决方案1】:

所有,我终于得到了这个工作。 问题是我无法正确获取 IP 地址。所以我首先在下面找到了我的本地 IP.. ......

                 for (NetworkInterface intf : Collections.list(NetworkInterface.getNetworkInterfaces()))
                 {
                     for (InetAddress addr : Collections.list(intf.getInetAddresses()))
                     {

                         if (!addr.isLoopbackAddress())
                         {
                             int ipAddress = 0;
                             ipAddress = wifiInfo.getIpAddress();
                             ip = "IP:   " + String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff),(ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));
                             localIP =  String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff),(ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));
                         }
                     }
                 }

localIP 是字符串格式的 IP 地址。 (1.2.3.4)..然后我只用IP地址制作了一个字节,并扫描了每一个..我将DNS服务器中的每个IP或有响应的每个IP保存到ArrayList。

byte[] ip = new byte[4];
    int ipInt = parseNumericAddress(localIP);
    ip[3] = (byte) (ipInt & 0xFF);
    ip[2] = (byte) ((ipInt >> 8) & 0xFF);
    ip[1] = (byte) ((ipInt >> 16) & 0xFF);
    ip[0] = (byte) ((ipInt >> 24) & 0xFF);


              progressDialog.incrementProgressBy(1);
              for (int i = 1; i <= 255; i++)
                {
                    progressDialog.incrementProgressBy(1);
                    ip[3] = (byte)i;

                    try {
                         InetAddress address = InetAddress.getByAddress(ip);
                        if (address.isReachable(100))
                        {
                            // machine is turned on and can be pinged
                            System.out.println("***Can Be Pinged*** Host Name " + address.getHostName() + address.getAddress().toString());
                            AvailableHostList.add(address.getHostName().toString());
                        }
                        else 
                        if (!address.getHostAddress().equals(address.getHostName() ) )
                        {
                            // machine is known in a DNS lookup
                            System.out.println("***Can Be Found in DNS Look Up*** HostName:" + address.getHostName() + "Address: "+address.getAddress().toString());
                            AvailableHostList.add(address.getHostName().toString());
                        }
                        else
                        {
                            System.out.println("Can Not Be Found" + address.toString());

                        }
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-12
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多