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

标签 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 数据包,我的手机接收传入的数据包。由于唯一的包裹来 self 的手机,很明显地址是我手机的地址。但是,如果广播地址有效,则每个网络接口(interface)都应发回信号。我说得对吗?

最佳答案

你部分正确。

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

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

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

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

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

关于android - 如何在 Android 中使用 BroadcastAddress 获取计算机的 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20837290/

相关文章:

javascript - 检测智能手机上的文本选择

Java:如何让客户端检测网络上的服务器?

go - 关闭具有多个值的 golang channel

c++ - 如何使用 Boost.Asio 解析 IPv4 地址的真实广播地址

android - 在 Android Facebook SDK 中使用共享对话框。如何知道用户是否实际分享或取消分享 Activity ?

android - 将按钮添加到可以注册点击的自定义 InfoWindowAdapter View

Android 构建 - "duplicate class: com.myapp.R"

c++ - Linux 应用程序无法从 169.254.x.x(本地链接)获取 UDP 消息

push-notification - 使用 APNS 广播单个消息

android - 从不包含表记录的 SOAP Web 服务返回的 JSON 字符串