- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,我想使用广播地址获取 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 数据包发送到广播地址。这主要是在公司网络上的情况。
但并非所有计算机都会回复该数据包,它们需要知道如何处理它。
如果您想使用现有协议(protocol)而不是部署您自己的应用程序,我建议您看看 ZeroConf 服务发现。 http://en.wikipedia.org/wiki/Zero-configuration_networking#Service_discovery
我希望这个解释能帮助您解决问题。
关于android - 如何在 Android 中使用 BroadcastAddress 获取计算机的 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20837290/
在我的应用程序中,我想使用广播地址获取 LAN 中计算机使用的所有 IP 地址。我使用以下代码来确定广播地址。 InetAddress getBroadcastAddress() { tr
我是一名优秀的程序员,十分优秀!