本例需要被找的机器同时也在运行以下代码。目前是遍历所有IP进行查找,效率很低,在没找到更好的办法之前只好用它了。
/** * 在局域网(LAN)里面根据主机名找到对应的IP。 * 设计作者: teasp * 信息描述: */ public class IpHostInLan { private static final int PORT = 4321; private static final String NOT_FOUND = "NotFound"; private ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>(); private static IpHostInLan instance = new IpHostInLan(); private volatile String resultIp = null; private IpHostInLan() { new Thread() { public void run() { try { String localHost = InetAddress.getLocalHost().getHostName(); ServerSocket ss = new ServerSocket(PORT); System.out.println("--------Listening to " + PORT + "----------"); while (true) { Socket socket = ss.accept(); try { socket.getOutputStream().write(localHost.getBytes()); socket.getOutputStream().flush(); socket.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (socket != null) socket.close(); } } } catch (Exception e) { e.printStackTrace(); } } }.start(); } public static IpHostInLan instance() { return instance; } /** * 获取主机名对应的IP。如果map中没有那么到局域网里面去找。 * @param host * @return */ public String getIp(String host) { String ip = map.get(host); if (ip != null) { //之前找过,现在不找了 if (ip.equals(NOT_FOUND)) return null; return ip; } ip = search(host); if (ip == null) { map.put(host, NOT_FOUND); } else { map.put(host, ip); } return ip; } /** * 先在同一网段找,如果找不到再到其它网段找。 * @param host * @return */ private String search(String host) { String ip = null; try { ip = InetAddress.getByName(host).getHostAddress(); } catch (Exception e) { System.out.println("failed to find " + host + " in my own IP segment."); // e.printStackTrace(); } if (ip == null) { try { String[] segs = InetAddress.getLocalHost().getHostAddress().split("[.]"); String prefix = segs[0] + "." + segs[1] + "."; int localSeg = Integer.valueOf(segs[2]); int i = 1; while (localSeg + i < 256 || localSeg - i > -1) { if (localSeg + i < 256) { ip = search(host, prefix + (localSeg + i) + "."); if (ip != null) break; } if (localSeg - i > -1) { ip = search(host, prefix + (localSeg - i) + "."); if (ip != null) break; } i++; } } catch (UnknownHostException e) { e.printStackTrace(); } System.out.format("Result from searching %s in other IP segments : %s\n", host, ip); } return ip; } /** * 同时只能做一个搜索。 * @param host * @param prefix * @return */ private synchronized String search(final String host, String prefix) { resultIp = null; System.out.format("Searching in %s segment...\n", prefix); ExecutorService service = Executors.newFixedThreadPool(64); for (int i=2; i<256; i++) { if (resultIp != null) { service.shutdownNow(); break; } final String ip = prefix + i; service.submit(new Callable<String>() { public String call() { Socket socket = null; try { socket = new Socket(); socket.connect(new InetSocketAddress(ip, PORT), 50); InputStream in = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String theHost = br.readLine(); if (host.equals(theHost)) { resultIp = ip; return ip; } } catch (Exception e) { // e.printStackTrace(); } finally { if (socket != null) try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } }); } service.shutdown(); while (resultIp == null && false == service.isTerminated()) { try { Thread.sleep(10); } catch (InterruptedException e) { } } service.shutdownNow(); return resultIp; } public static void main(String[] args) throws IOException { System.out.println(IpHostInLan.instance().getIp(args[0])); } }
相关推荐
标题中的“局域网IP扫描-跨网段IP扫描程序”指的是一个专门用于在局域网内部进行IP地址探测和扫描的工具,它能够跨越不同的网络子网进行操作。这样的程序通常由网络管理员或者IT技术人员使用,以了解网络中设备的...
IP-MAC Scanner是一款专门针对这一需求设计的工具,它能够帮助网络管理员快速、准确地获取网络中的IP地址、MAC地址、主机名、工作组以及打印机名等关键信息,极大地提升了网络管理的效率。尤其值得一提的是,这款...
这些工具通常具备用户友好的界面,允许用户输入需要扫描的网段范围,然后自动执行扫描任务,显示结果,包括IP地址、主机名、开放的端口和服务等信息。有的软件还支持自定义扫描策略,如设置扫描速度、选择扫描类型...
在IT领域,尤其是在网络编程和系统开发中,获取局域网中的计算机名称和IP地址是一项基本操作。这个VC源码项目就是为此目的设计的,它适用于VC6.0这一经典开发环境。通过这段代码,开发者可以了解到如何在C++环境下...
- **查看结果**:扫描完成后,软件会列出所有发现的设备,包括IP、MAC地址、主机名、状态等信息。 - **操作设备**:点击设备条目,可以执行远程控制操作,如打开网页、唤醒或关闭设备。 4. **安全与隐私** 在...
批处理bat实现扫描局域网所有机器IP、MAC地址和计算机名
在进行IP扫描时,可能会用到这个类来解析IP地址或主机名。 4. **异步编程**:为了提高性能和用户体验,IP扫描通常会采用异步处理,使用`async/await`关键字来并行发送多个ping请求,避免阻塞主线程。 5. **套接字...
- **网络扫描**:使用软件工具如`nmap`或本文提到的`nbtscan`,这些工具能扫描局域网内所有活动设备的IP地址和主机名。 - **DHCP服务器日志**:如果局域网使用DHCP动态分配IP地址,可以通过查看DHCP服务器的日志来...
总结,通过C#,我们可以轻松地获取局域网内设备的IP地址和MAC地址,并进行IP反向解析得到主机名。对于更复杂的网络设备发现,可能需要结合其他技术或工具。理解和掌握这些基础操作,对于网络编程和网络管理至关重要...
在提供的文件“复件 复件 扫描局域网的IP和主机名”中,很可能是VB代码实现的扫描程序,包含了扫描逻辑和结果显示的部分。通过分析和学习这段代码,可以深入理解上述知识点,并掌握实际应用中的技巧。 总的来说,...
**NATAPP内网穿透:实现两个不同网段主机的连通** 在现代网络环境中,SSH(Secure Shell)远程连接是一种常见的管理服务器的方式,它允许用户通过加密的通道安全地控制远程主机。然而,SSH连接的基本前提是源主机和...
标题中的“局域网内IP扫描批处理文件”指的是在局域网环境下,通过特定的批处理脚本来实现对同一网段内的IP地址进行扫描的一种技术。批处理文件(.bat)是Windows操作系统中的一种文本文件,它可以包含一系列命令,...
3. **设备信息收集**:可能能提供设备的MAC地址、操作系统类型、主机名等详细信息,这对于网络管理与故障排查大有裨益。 4. **安全评估**:通过对开放端口的识别,用户可以评估网络的安全性,找出可能存在风险的...
这段代码首先获取本机主机名,然后使用DNS服务解析该主机名得到所有IP地址。遍历这些地址,找到IPv4类型的地址(AddressFamily.InterNetwork)并返回。 获取网卡MAC地址: 获取MAC地址可以使用`System.Net.Network...
执行这个命令后,系统会返回该网段内所有响应的设备的IP地址和对应的NetBIOS主机名。 标签“查看整个网段IP”和“网段IP”进一步强调了这个操作的目的是获取并查看同一网络子网内的所有IP地址。在实际应用中,这...
在IT行业中,网络管理是至关重要的任务之一,而检测局域网内的IP设备则是网络管理员的日常工作之一。本文将详细探讨“ipscan”这个小巧且方便的工具,它专门用于快速扫描并检测指定网段内的活跃主机。 首先,我们要...
这个“局域网IP搜索程序”正是这样一个工具,它可以帮助用户快速地搜索并获取网段内的IP地址、主机名以及MAC地址等关键信息。 【描述】中提到,该程序的源代码是用VC++编写的,并且基于VC6.0开发环境。VC++(Visual...
这通常是通过DNS(域名系统)服务实现的,将IP地址转换为人类可读的主机名。 6. **源码分析**:在压缩包中的"codesc.net"文件可能是VB源代码,包含了实现上述功能的具体代码结构。源码的学习可以帮助我们理解VB如何...
内容索引:VC/C++源码,网络相关,局域网,IP扫描,主机名 扫描局域网的IP和主机名,程序运行过程:设置ip地址默认范围,创建处于非触发状态的事件。类型为手动,ListView 初始化,创建nbtstat线程,循环对要查询的ip发...
内置nbtstat,能快速查找某一IP网段内的所有主机,并根据IP地址得到对方主机的主机名、工作组名、用户名、MAC地址,速度极快。并方便地访问其资源。扫描某一IP网段内的所有主机的端口,向某一主机发送消息。提供断点...