我正在尝试编写Java程序来查找连接到家庭网络的任何计算机的地址。我的第一个想法是遍历192.168.1。[0-254]范围内的每个地址,并检查网络上是否有一台带有该地址的机器,但我无法找出一种检查给定地址的简单方法有一台带有该地址的机器。我想我可以尝试在每个可能的端口上打开一个套接字,并得出结论,如果它们全部失败,那么就没有机器,但是第一眼看到这似乎需要花费太长时间没有机器(它花了一分钟来检查地址上只有2个端口,没有连接机器)。
是否有一种快速简便的方法来检查是否有一台具有给定地址的机器?除了尝试每个地址之外,还有更好的方法在Java中执行此操作吗?
提前感谢您提供任何帮助
答案 0 :(得分:1)
如果您只是想知道网络上的哪些IP,请使用nmap。
如果你想学习如何为自己做这件事,我可能会建议先用C语言完成这项工作。所有sockets APIs都是用C语言编写的,它可能是使用套接字最自然的环境。 (另外,TCP/IP Illustrated使用C,因此更容易找到示例。)
那就是are examples of Java using ICMP;他们都会使用jnetpcap或Jpcap,libpcap(基础C库)周围的包装。
如果您想进行端口扫描,可以采用以下几种方法:
您可以多线程化您的应用程序:创建一个包含100或200个线程的线程池,并提交“作业”以尝试connect()
到可能打开的每个(IP,端口)对。由于每个IP有65k个端口,并且连接超时可能很长(如果您的代码没有获得RST
或ICMP主机或端口无法访问的响应),这可能非常慢并且可能非常耗费内存。如果在三到五秒内未建立连接,您可以在每个线程中设置警报......
您可以切换到较低级别并使用libpcap
或类似工具发送手工制作的连接尝试,并且只记下回复(并且不要费心去做建立连接)。这是nmap
采用的方法之一,也是为什么它比您的应用程序更快地给出答案的原因之一。
答案 1 :(得分:0)
您可以尝试使用Runtime.exec发出ping命令或在java本身内开发ping客户端。使用ping可以避免检查每个端口。
答案 2 :(得分:0)
您可以使用InetAddress.isReachable(int timeout)
,因为它会发送ICMP PING,但有一些权限问题可以使用(search SO获取有关详细信息的帮助)。
您还可以使用DatagramSocket
发送UDP数据包并查找PortUnreachableException
s。如果将它们发送到端口7(回声),您应该获得异常或作为响应发送的相同数据。此方法也存在一些问题,因为它要求网络上的所有主机在其未侦听的端口上接收UDP数据包时发送响应。通常他们会这样做,但防火墙可能会过滤掉它。
运行ping
命令可能是最简单的方法。