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

如何在Android中使用BroadcastAddress获取计算机的IP地址,android,broadcast,Android,Broadcast,在我的应用程序中,我希望使用广播地址获取局域网中计算机的所有IP地址。我使用以下代码来确定广播地址 InetAddress getBroadcastAddress() { try { WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); DhcpInfo dhcp = wifi.getDhcpInfo(); // handle null someho

在我的应用程序中,我希望使用广播地址获取局域网中计算机的所有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;
  }
有可能吗

编辑:


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

你说得部分正确

当您向广播地址发送UDP数据包时,网络上的所有计算机都将接收该数据包,除非网络上的路由器限制将UDP数据包发送到广播地址。在企业网络中,这是最常见的情况

但并不是所有的计算机都会回复这个数据包,它们需要知道如何处理它

  • 您可以编写一个服务器应用程序,该应用程序理解您的UDP数据包,并配置为回复该数据包,然后将该服务器应用程序部署到网络上的所有计算机
  • 或者实现现有的发现协议,如Bonjour(Mac)或SSDP(Windows)
如果希望使用现有协议而不是部署自己的应用程序,我建议您查看ZeroConf服务发现。


我希望这个解释能帮助你解决你的问题。

是的,确实如此。我已经开始实现第一种方式(UDP服务器应用程序)。@Nestor我需要这样的东西。你能分享一些关于它的信息吗?@learner你可以在最初的帖子中看到Android客户端。我创建了一个.Net UDP侦听器服务(UDP服务器应用程序),当它接收到UDP数据包时,会向客户端发送一个响应数据包。服务器应用程序如下所示:
 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();
  }