我想找到位于同一本地网络上的所有系统,即具有相同子网掩码的系统。
我想我必须使用Java中的InetAddress
类,但我不知道该怎么做。
我的算法是:
查找本地网络中的所有可用系统
检查它们是否在我请求的端口上运行
- 醇>
请记住在此端口上运行的系统的IP
InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
System.out.println(networkInterface);
networkInterface.getByInetAddress(localHost);
for (){
networkInterface.getByInetAddress(localHost)
}
我认为networkInterface.getByInetAddress(localHost)
可以为我提供子网中所有可用的IP地址,但我不知道如何为所有可用系统执行此操作,以及for
的条件是什么子句。
答案 0 :(得分:4)
查找IP子网中的所有可能的 IP地址非常简单。只需编写一个循环,枚举子网中所有可能的byte[]
表示,并为它们构造InetAddress
个实例。
这很容易,困难在于解决这两个问题:
如何在子网上找到所有实时 IP地址,
对于给定的IP地址,您如何判断它是否使用特定端口。
第一个问题可以通过两种方式解决:
您可以使用InetAddress.isAlive()
方法查看主机是否响应ping。问题是某些主机可能配置为不响应ping,或者ping可能被内部防火墙阻止。如果子网很大,这也不起作用。问题是您需要ping大量主机,这将花费很长时间并产生大量网络流量......特别是如果有多个应用程序实例正在执行此操作。
更智能的选择是检查本地计算机的ARP缓存,并提取它知道的所有IP地址。问题是1)您的应用程序可能没有访问ARP缓存的访问权限,2)某些IP地址可能不在缓存中,以及3)无法以纯Java方式访问ARP缓存。
第二个问题取决于端口上服务的性质:
如果是基于TCP的服务,则可以尝试使用普通套接字连接到IP /端口。如果接受连接,则端口正在被某些东西使用。它可能是也可能不是您期望的服务,但一般来说,告诉它的唯一方法是尝试使用服务。
如果它是基于UDP的服务,那么现在通常会 来了解某些东西是否正在使用该端口。
答案 1 :(得分:0)
我希望你的意思是:
“我希望发现同一本地网络上的所有系统(运行我的程序的计算机)的主IP地址正在侦听某个TCP端口。”
使用UDP,这是一个稍微难以解决的问题 - 您可以查找跳出,但您的数据包可能被吃掉或丢失(就像回复一样)。
现在,假设TCP,您有三个步骤。
对于第1步,请使用InetAddress.getLocalHost()
。
对于步骤2,获取检索到的地址的子网部分,然后尝试该子网内的每个可能的主机。我们希望它是C级,只有254个主机。 没有100%肯定的方法可以在不尝试每个主机的情况下获取所有主机。非100%(并且更复杂)的方式是使用ARP表来获取路由器的网络视图,将广播ping发送到本地网络,或者下降到第2层并发送广播以太网数据包
对于步骤3,打开与相应端口上每个主机的连接,然后将其关闭。如果连接超时或被拒绝,请刮擦主机。否则,将其添加到“收听”列表中。您可能希望一次尝试多个连接,并将超时间隔设置为较小,因为大多数人都不会在监听。
第4步:恭喜!您刚刚在Java中创建了一个功能较差的nmap
版本。