我通过使用 nbtstat 解决了这个问题。nbtstat 将返回与给定 IP 地址对应的 NetBios 计算机名称。
例如:nbtstat -A 10.0.0.5
在 Java 中,我创建了一个循环来检查给定的 ip 是否可达。我的 Azure VPN 范围是 10.0.0.x。所以我的循环将检查 ip 10.0.0.1 直到 10.0.0.20。如果 ip 可以访问,它将查找计算机名称。如果计算机名称是我正在寻找的计算机名称,那么我有要连接的 IP 地址。我使用可达(ping)来加速这个过程。
示例代码:使用循环检查 ip 是否可达。类似于 ping:
for (byte i = 1; i <= 20; i++)
{
inet = InetAddress.getByAddress(new byte[] { 10, 0, 0, i });
System.out.println("Sending Ping Request to " + inet);
reachable = inet.isReachable(pingTimeOut);
System.out.println(reachable ? "Host is reachable" : "Host is NOT reachable");
if (reachable)
{
System.out.println("Name resolve " + inet.getHostAddress());
trace = GetNameByIp(inet.getHostAddress());
if (trace.contains(computerName)) return "10.0.0." + Byte.toString(i);
}
}
检索 Netbios 名称:
Process traceRt;
System.out.println("nbtstat -A " + address);
traceRt = Runtime.getRuntime().exec("nbtstat -A " + address);
// read the output from the command
route = convertStreamToString(traceRt.getInputStream());