0

我正在尝试编写一个 Java 程序来查找连接到我的家庭网络的任何机器的地址。我的第一个想法是遍历 192.168.1.[0-254] 范围内的每个地址,并检查网络上是否存在具有该地址的机器,但我想不出一种简单的方法来检查给定地址是否有一台具有该地址的机器。我想我可以尝试在每个可能的端口上打开一个套接字,并得出结论,如果它们都失败了,那么就没有机器,但是乍一看,当没有机器时,这似乎花费了太长时间(检查需要一分钟以上)一个地址上只有 2 个端口,没有连接机器)。

有没有一种快速简便的方法来检查是否有给定地址的机器?除了尝试每个地址之外,还有没有更好的方法在 Java 中做到这一点?

提前感谢您的帮助

4

3 回答 3

1

如果您只想找出网络上的哪些 IP 被占用,只需使用nmap

如果你想自己学习如何做到这一点,我可能建议先用 C 来完成这项工作。所有的套接字 API都是用 C 编写的,它可能是使用套接字最自然的环境。(另外,TCP/IP Illustrated使用 C,因此更容易找到示例。)

也就是说,有一些使用 ICMP 的 Java 示例;他们都将使用jnetpcapJpcap,包装libpcap(底层 C 库)。

如果要进行端口扫描,可以采取以下几种方法:

  • 您可以多线程您的应用程序:创建一个 100 或 200 个线程的线程池,并提交“作业”以尝试connect()每个可能打开的(IP、端口)对。由于每个 IP 有 65k 个端口,并且连接超时可能会很长(如果您的代码没有得到RSTICMP 主机或端口无法访问响应),这可能会非常慢并且可能非常占用内存。如果连接未在三五秒内建立,您可以在每个线程中设置警报...

  • 您可以切换到较低级别并使用libpcap或类似的工具来发送手工制作的连接尝试,并且只记下回复(并且不要费心设置连接)。这是 采用的方法nmap之一,也是它比您的应用程序更快地给出答案的原因之一。

于 2011-06-05T02:41:55.377 回答
0

您可以尝试使用 Runtime.exec 发出 ping 命令或在 java 本身中开发 ping 客户端。使用 ping 将使您不必检查每个端口。

于 2011-06-05T01:42:19.837 回答
0

你可以使用InetAddress.isReachable(int timeout)它,因为它会发送一个 ICMP PING,但是有一些使用它的权限陷阱(搜索 SO以获取有关详细信息的帮助)。

DatagramSocket您还可以使用并查找PortUnreachableExceptions来发送 UDP 数据包。如果您将它们发送到端口 7 (echo),您应该得到一个异常或作为响应发送的相同数据。此方法也有一些陷阱,因为它要求网络上的所有主机在它未侦听的端口上接收到 UDP 数据包时发送响应。通常他们会这样做,但防火墙可能会将其过滤掉。

只运行ping命令可能是最简单的方法。

于 2011-07-04T21:34:36.090 回答