`
teasp
  • 浏览: 61720 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

局域网跨网段根据主机名找IP

阅读更多

    本例需要被找的机器同时也在运行以下代码。目前是遍历所有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]));
    }
}

 

0
4
分享到:
评论

相关推荐

    局域网IP扫描-跨网段IP扫描程序

    标题中的“局域网IP扫描-跨网段IP扫描程序”指的是一个专门用于在局域网内部进行IP地址探测和扫描的工具,它能够跨越不同的网络子网进行操作。这样的程序通常由网络管理员或者IT技术人员使用,以了解网络中设备的...

    IP-MAC Scanner 局域网IP-MAC扫描器 跨网段VLAN

    IP-MAC Scanner是一款专门针对这一需求设计的工具,它能够帮助网络管理员快速、准确地获取网络中的IP地址、MAC地址、主机名、工作组以及打印机名等关键信息,极大地提升了网络管理的效率。尤其值得一提的是,这款...

    局域网多网段IP扫描工具

    这些工具通常具备用户友好的界面,允许用户输入需要扫描的网段范围,然后自动执行扫描任务,显示结果,包括IP地址、主机名、开放的端口和服务等信息。有的软件还支持自定义扫描策略,如设置扫描速度、选择扫描类型...

    VC源码获取局域网中所有计算机名称及ip地址

    在IT领域,尤其是在网络编程和系统开发中,获取局域网中的计算机名称和IP地址是一项基本操作。这个VC源码项目就是为此目的设计的,它适用于VC6.0这一经典开发环境。通过这段代码,开发者可以了解到如何在C++环境下...

    局域网ip深入扫描工具(Advanced_IP_Scanner)

    - **查看结果**:扫描完成后,软件会列出所有发现的设备,包括IP、MAC地址、主机名、状态等信息。 - **操作设备**:点击设备条目,可以执行远程控制操作,如打开网页、唤醒或关闭设备。 4. **安全与隐私** 在...

    批处理bat实现扫描局域网所有机器IP、MAC地址和计算机名

    批处理bat实现扫描局域网所有机器IP、MAC地址和计算机名

    C# 局域网IP扫描 实例源码(网络操作)

    在进行IP扫描时,可能会用到这个类来解析IP地址或主机名。 4. **异步编程**:为了提高性能和用户体验,IP扫描通常会采用异步处理,使用`async/await`关键字来并行发送多个ping请求,避免阻塞主线程。 5. **套接字...

    检测局域网的ip地址

    - **网络扫描**:使用软件工具如`nmap`或本文提到的`nbtscan`,这些工具能扫描局域网内所有活动设备的IP地址和主机名。 - **DHCP服务器日志**:如果局域网使用DHCP动态分配IP地址,可以通过查看DHCP服务器的日志来...

    C#获取局域网内所有联网设备的IP地址和MAC地址

    总结,通过C#,我们可以轻松地获取局域网内设备的IP地址和MAC地址,并进行IP反向解析得到主机名。对于更复杂的网络设备发现,可能需要结合其他技术或工具。理解和掌握这些基础操作,对于网络编程和网络管理至关重要...

    vb 局域网IP扫描

    在提供的文件“复件 复件 扫描局域网的IP和主机名”中,很可能是VB代码实现的扫描程序,包含了扫描逻辑和结果显示的部分。通过分析和学习这段代码,可以深入理解上述知识点,并掌握实际应用中的技巧。 总的来说,...

    NATAPP内网穿透:实现两个不同网段主机的连通

    **NATAPP内网穿透:实现两个不同网段主机的连通** 在现代网络环境中,SSH(Secure Shell)远程连接是一种常见的管理服务器的方式,它允许用户通过加密的通道安全地控制远程主机。然而,SSH连接的基本前提是源主机和...

    局域网内IP扫描批处理文件

    标题中的“局域网内IP扫描批处理文件”指的是在局域网环境下,通过特定的批处理脚本来实现对同一网段内的IP地址进行扫描的一种技术。批处理文件(.bat)是Windows操作系统中的一种文本文件,它可以包含一系列命令,...

    最好用的局域网ip扫描工具

    3. **设备信息收集**:可能能提供设备的MAC地址、操作系统类型、主机名等详细信息,这对于网络管理与故障排查大有裨益。 4. **安全评估**:通过对开放端口的识别,用户可以评估网络的安全性,找出可能存在风险的...

    C# 编程 获取局域网IP及网卡MAC地址

    这段代码首先获取本机主机名,然后使用DNS服务解析该主机名得到所有IP地址。遍历这些地址,找到IPv4类型的地址(AddressFamily.InterNetwork)并返回。 获取网卡MAC地址: 获取MAC地址可以使用`System.Net.Network...

    用一个命令查看整个网段的 IP地址

    执行这个命令后,系统会返回该网段内所有响应的设备的IP地址和对应的NetBIOS主机名。 标签“查看整个网段IP”和“网段IP”进一步强调了这个操作的目的是获取并查看同一网络子网内的所有IP地址。在实际应用中,这...

    ipscan小巧方便检测网段内的主机

    在IT行业中,网络管理是至关重要的任务之一,而检测局域网内的IP设备则是网络管理员的日常工作之一。本文将详细探讨“ipscan”这个小巧且方便的工具,它专门用于快速扫描并检测指定网段内的活跃主机。 首先,我们要...

    局域网IP搜索程序(VC++的源代码)

    这个“局域网IP搜索程序”正是这样一个工具,它可以帮助用户快速地搜索并获取网段内的IP地址、主机名以及MAC地址等关键信息。 【描述】中提到,该程序的源代码是用VC++编写的,并且基于VC6.0开发环境。VC++(Visual...

    VB在指定网段内扫描可用IP及主机名称.rar

    这通常是通过DNS(域名系统)服务实现的,将IP地址转换为人类可读的主机名。 6. **源码分析**:在压缩包中的"codesc.net"文件可能是VB源代码,包含了实现上述功能的具体代码结构。源码的学习可以帮助我们理解VB如何...

    VC扫描局域网IP和主机名源代码

    内容索引:VC/C++源码,网络相关,局域网,IP扫描,主机名 扫描局域网的IP和主机名,程序运行过程:设置ip地址默认范围,创建处于非触发状态的事件。类型为手动,ListView 初始化,创建nbtstat线程,循环对要查询的ip发...

    局域网搜索

    内置nbtstat,能快速查找某一IP网段内的所有主机,并根据IP地址得到对方主机的主机名、工作组名、用户名、MAC地址,速度极快。并方便地访问其资源。扫描某一IP网段内的所有主机的端口,向某一主机发送消息。提供断点...

Global site tag (gtag.js) - Google Analytics