如何在Android中使用BroadcastAddress获取计算机的IP地址

时间:2013-12-30 10:05:39

标签: android broadcast

在我的应用程序中,我想获取使用广播地址的LAN中的计算机所占用的所有IP地址。我使用以下代码来确定广播地址。

InetAddress getBroadcastAddress()
  {
    try
    {
      WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
      DhcpInfo dhcp = wifi.getDhcpInfo();
      // handle null somehow

      int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
      byte[] quads = new byte[4];
      for (int k = 0; k < 4; k++)
        quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
      return InetAddress.getByAddress(quads);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    return null;
  }

据我所知,据我所知,当一个人使用广播地址时,每台计算机都会回答它,所以如果我只是向该地址发送“ping”消息,局域网的计算机就会回答它。我该如何在Android中ping它们?什么命令会发送给我的地址?

以下代码只是从发送电话返回数据包,但我需要计算机的地址:

 int PORT = 8080;
 int DISCOVERY_PORT = 8080;
 try
 {
  DatagramSocket socket = new DatagramSocket(PORT);
  socket.setBroadcast(true);
  String data="TEST";
  DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(),
  getBroadcastAddress(), DISCOVERY_PORT);
  socket.send(packet);

  byte[] buf = new byte[1024];
  DatagramPacket packet2 = new DatagramPacket(buf, buf.length);
  Log.w(Tags.DEBUG,"Receive start");
  socket.receive(packet2);
  Log.w(Tags.DEBUG,packet2.getAddress().toString());
  }
  catch (Exception e)
  {
    e.printStackTrace();
  }

甚至可能吗?

编辑:

如果我说实话它的工作原理是:我的手机发送一个UDP数据包,我的手机收到传入的包裹。由于唯一的套餐来自我的手机,很明显该地址是我手机的地址。但是,如果广播地址有效,则每个网络接口都应该发回信号。我是对的吗?

1 个答案:

答案 0 :(得分:2)

你是部分正确的。

当您将UDP数据包发送到广播地址时,网络上的所有计算机都将接收数据包,除非网络上的路由器限制UDP数据包被发送到广播地址。这主要是在公司网络上的情况。

但并非所有计算机都会回复该数据包,他们需要知道如何处理它。

  • 要么编写一个了解UDP数据包的服务器应用程序,并将其配置为回复该数据包并将该服务器应用程序部署到网络上的所有计算机上。
  • 或者您实施现有的发现协议,例如Bonjour(Mac)或SSDP(Windows)

如果您想使用现有协议而不是部署自己的应用程序,我建议您查看ZeroConf Service Discovery。 http://en.wikipedia.org/wiki/Zero-configuration_networking#Service_discovery

我希望这个解释可以帮助您解决问题。