存活主机发现(基于nmap和Qt)

本文介绍如何使用Nmap工具结合Qt编程环境进行主机发现,并将扫描结果以XML格式输出,最后通过Qt读取并解析XML文件获取在线主机列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.下载nmap并安装。下载地址:nmap

2.nmap可以将输出结果定向为xml文件。因此,可以先通过进程将nmap输出保存至xml文件,然后再去解析xml即可得到扫描的结果。nmap主机发现命令:nmap -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 -PE 1-254 -oX nmap_output.xml。一个网段大概2s,还挺快的。参数解析命令如下:

-sn 只ping主机,不扫描端口
-PE 通过ICMP echo判定主机是否存活
-n  不反向解析IP地址到域名
–min-hostgroup 1024    最小分组设置为1024个IP地址,当IP太多时,nmap需要分组,然后串行扫描
–min-parallelism 1024  探针的数目限定最小为1024,和扫描时间有关,当然依赖于系统和网络资源
-oX nmap_output.xml    将结果以文件名nmap_output.xml的XML格式输出。

3.部分代码和运行结果如下:

    qDebug() << "start: " << QDateTime::currentDateTime().toString("hh:mm:ss:zzz");
    QProcess cmd;
    //-sn		只ping主机,不扫描端口 
    //-PE		通过ICMP echo判定主机是否存活 
    //-n		不反向解析IP地址到域名
    //–min-hostgroup 1024 最小分组设置为1024个IP地址,当IP太多时,nmap需要分组,然后串行扫描
    //-min-parallelism 1024 探针的数目限定最小为1024,和扫描时间有关,当然依赖于系统和网络资源 
    //-oX nmap_output.xml   将结果以文件名nmap_output.xml的XML格式输出
    QString arg("nmap -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 -PE  192.168.0.1-254 -oX nmap_output.xml");
    //process.execute(cmd);
    cmd.start(arg);
    cmd.waitForReadyRead();
    cmd.waitForFinished();
    //QString retStr = cmd.readAll();

    readNampOutputXml("nmap_output.xml");

    qDebug() << "over: " << QDateTime::currentDateTime().toString("hh:mm:ss:zzz");
QStringList readNampOutputXml(QString fileName)
{
    QStringList lstUpHostIP;
    if (fileName.isEmpty())
    {
        qDebug() << QStringLiteral("fileName is empty!");
        return lstUpHostIP;
    }
    pugi::xml_document xmlDoc;
    if (!xmlDoc.load_file(fileName.toLocal8Bit().data(), pugi::parse_default,     pugi::encoding_utf8)) 
    {
        qDebug() << QStringLiteral("read file failed!");
        return lstUpHostIP;
    }
    pugi::xml_node nodeHostInfos = xmlDoc.child("nmaprun");
    for (pugi::xml_node nodeHost = nodeHostInfos.first_child(); nodeHost; nodeHost =     nodeHost.next_sibling())
    {
        for (pugi::xml_node nodeAddr = nodeHost.first_child(); nodeAddr; nodeAddr =      nodeAddr.next_sibling())
        {
            QString nodename = nodeAddr.name();
            if (nodename == "address")
            {
                QString addrtype = nodeAddr.attribute("addrtype").as_string();
                if ("ipv4" == addrtype)
                {
                    QString ip = nodeAddr.attribute("addr").as_string();
                    lstUpHostIP << ip;
                    qDebug() << ip;
                }
            }
        }
    }	
    return lstUpHostIP;
}

destiny

4.剩下的部分是一个小例子,在具体的使用时建议移至子线程(xml解析用的是pugixml库),传送门:Qt+nmap主机发现示例

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值