如何获取在特定端口上运行的子网的所有IP地址

时间:2012-01-22 06:45:59

标签: java sockets networking p2p

我想找到位于同一本地网络上的所有系统,即具有相同子网掩码的系统。

我想我必须使用Java中的InetAddress类,但我不知道该怎么做。 我的算法是:

  
      
  1. 查找本地网络中的所有可用系统

  2.   
  3. 检查它们是否在我请求的端口上运行

  4.   
  5. 请记住在此端口上运行的系统的IP

  6.   
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的条件是什么子句。

2 个答案:

答案 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. 获取您认为是“主要”接口的本地接口的IP地址。
  2. 枚举与此地址位于同一子网的主机。
  3. 对于每个主机,确定相应的端口是否正在侦听。
  4. 对于第1步,请使用InetAddress.getLocalHost()

    对于步骤2,获取检索到的地址的子网部分,然后尝试该子网内的每个可能的主机。我们希望它是C级,只有254个主机。 没有100%肯定的方法可以在不尝试每个主机的情况下获取所有主机。非100%(并且更复杂)的方式是使用ARP表来获取路由器的网络视图,将广播ping发送到本地网络,或者下降到第2层并发送广播以太网数据包

    对于步骤3,打开与相应端口上每个主机的连接,然后将其关闭。如果连接超时或被拒绝,请刮擦主机。否则,将其添加到“收听”列表中。您可能希望一次尝试多个连接,并将超时间隔设置为较小,因为大多数人都不会在监听。

    第4步:恭喜!您刚刚在Java中创建了一个功能较差的nmap版本。