在我的应用程序中,我想获取使用广播地址的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数据包,我的手机收到传入的包裹。由于唯一的套餐来自我的手机,很明显该地址是我手机的地址。但是,如果广播地址有效,则每个网络接口都应该发回信号。我是对的吗?
答案 0 :(得分:2)
你是部分正确的。
当您将UDP数据包发送到广播地址时,网络上的所有计算机都将接收数据包,除非网络上的路由器限制UDP数据包被发送到广播地址。这主要是在公司网络上的情况。
但并非所有计算机都会回复该数据包,他们需要知道如何处理它。
如果您想使用现有协议而不是部署自己的应用程序,我建议您查看ZeroConf Service Discovery。 http://en.wikipedia.org/wiki/Zero-configuration_networking#Service_discovery
我希望这个解释可以帮助您解决问题。