gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:50:39 25 4
gpt4 key购买 nike

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

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

  1. Find all available system in a local network

  2. Check if they run on a my requested port

  3. Keep in mind the IP of system which runs on this port

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 子句的条件。

最佳答案

在 IP 子网中查找所有可能 IP 地址很简单。只需编写一个循环,枚举子网中所有可能的 byte[] 表示,并为它们构造 InetAddress 实例。

这是简单的部分,困难的部分是解决这两个问题:

  • 如何找到子网上的所有 Activity IP 地址,以及

  • 对于给定的 IP 地址,您如何确定它是否正在使用特定端口。

第一个问题可以通过两种方式解决:

  • 您可以使用 InetAddress.isAlive() 方法查看主机是否响应 ping。问题是某些主机可能配置为不响应 ping,或者 ping 可能被内部防火墙阻止。如果子网很大,这也不起作用。问题是您需要 ping 大量主机,这将花费很长时间并产生大量网络流量……尤其是当有多个应用程序实例执行此操作时。

  • 更明智的选择是检查本地计算机的 ARP 缓存,并提取它知道的所有 IP 地址。问题在于 1) 您的应用程序可能没有访问 ARP 缓存的访问权限,2) 某些 IP 地址可能不在缓存中,以及 3) 无法在纯 Java 中访问 ARP 缓存。

第二个问题取决于端口上服务的性质:

  • 如果它是基于 TCP 的服务,那么您可以尝试使用普通套接字连接到 IP/端口。如果连接被接受,则该端口正在被某些东西使用。它可能是您期望的服务,也可能不是您期望的服务,但一般来说,唯一的判断方法是尝试使用该服务。

  • 如果它是基于 UDP 的服务,那么现在通常可以知道是否有东西正在使用该端口。

关于java - 如何获取在特定端口上运行的子网的所有 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8959537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com