IP scanner



  • ciao!

    sto usando questo codice per verificare gli indirizzi IP attivi sulla rete:

        QString baseNetowrk = "192.168.1.";
        for(int i = 0;i < 255;i++) {
            QString currIp = (baseNetowrk + "%1").arg(i);
            qDebug() << "IP: " << currIp;
            QHostInfo hostInfo = QHostInfo::fromName(currIp);
            qDebug() << "NOME: " << hostInfo.hostName();
        }
    

    c'è però qualcosa che non quadra.
    su vari pc attivi, non mi identifica il nome.
    inoltre mi identifica il nome di alcuni pc / server spenti.
    ad esempio:

    IP:  "192.168.1.134"
    NOME:  "matte-ant.laltramoda.local" --> NON ATTIVO
    
    IP:  "192.168.1.203"
    NOME:  "amodabo.laltramoda.local" --> NON ATTIVO
    
    IP:  "192.168.1.252"
    NOME:  "192.168.1.252" --> ACCESO E FUNZIONANTE
    

    sapete darmi qualche delucidazione al riguardo??


  • Qt Champions 2018

    che sistema operativo usi?



  • sto facendo i test su linux.
    ma in effetti usano tutti windows, a parte le stampanti e il firewall (che usa sempre linux).
    forse potrebbe essere questo il motivo!



  • Secondo me QHostInfo non ti ritorna i dati in tempo reale ma ciò che trova nel server dns - wins, in base alla tabella arp.



  • @mrdebug said in IP scanner:

    Secondo me QHostInfo non ti ritorna i dati in tempo reale ma ciò che trova nel server dns - wins, in base alla tabella arp.

    si ho pensato anche io.
    però ho fatto il flush della cache, ed ottengo lo stesso risultato.

    cmq, avete idea di come poter ottenere il risultato??



  • allora, ho provato con questo codice, che in sostanza invia un ping ai vari IP:

    void MainWindow::on_pushButton_clicked() {
        QString baseNetowrk = "192.168.1.";
    #if defined(WIN32)
        QString parameter = "-n 1";
    #else
        QString parameter = "-c 1";
    #endif
        for(int i = 0; i < 256; i++) {
            QString currIp(baseNetowrk + QString::number(i));
            int exitCode = QProcess::execute("ping", QStringList() << parameter << currIp);
            if (exitCode == 0) {
                qDebug() << "OK :" << baseNetowrk + i;
            } else {
                qDebug() << "KO";
            }
        }
    }
    

    funzionare funziona, ma è lento una quaresima.


  • Qt Champions 2018

    Purtroppo non c'e' molto da fare, e' impossibile sapere se un IP e' attivo o no senza contattarlo. Puoi usare QtConcurrent per velocizzarlo:

    QStringList possibleIPs;
    for(int i = 0; i < 256; i++)  possibleIPs.append(baseNetowrk + QString::number(i));
    const auto avaliableIPs = QtConcurrent::blockingMapped<QList<bool> >(possibleIPs,[](const QString& currIp)->bool{
    return QProcess::execute("ping", QStringList() << 
    #ifdef Q_OS_WIN
        QStringLiteral("-n 1")
    #else
        QStringLiteral("-c 1");
    #endif
    << currIp) ==0;
    });
    


  • ciao!

    sto provando con il tuo esempio, ma ottengo una valanga di errori (ne posto alcuni):

    /usr/include/qt/QtCore/qvector.h:832: error: forming reference to void
     int QVector<T>::indexOf(const T &t, int from) const
         ^~~~~~~~~~
    
    
    /usr/include/qt/QtConcurrent/qtconcurrentmapkernel.h:124: error: no type named ‘result_type’ in ‘struct MainWindow::on_pushButton_clicked()::<lambda(const class QString&)>’
             IntermediateResults<typename MapFunctor::result_type> results;
                                                                   ^~~~~~~
    
    
    /usr/include/qt/QtConcurrent/qtconcurrentreducekernel.h:123: error: ‘const class QVector<void>’ has no member named ‘at’; did you mean ‘data’?
                 reduce(r, result.vector.at(i));
                           ~~~~~~~~~~~~~~^~
                           data
    
    /usr/include/qt/QtCore/qvector.h:352: error: ‘void*’ is not a pointer-to-object type
                 from++->~T();
                 ^~~~
    

    ho modificato la funzione dell'evento da cui parte tutto:

    int MainWindow::on_pushButton_clicked() {
        QString baseNetowrk = "192.168.1.";
        QStringList possibleIPs;
        for(int i = 0; i < 256; i++) possibleIPs.append(baseNetowrk + QString::number(i));
    
        const auto avaliableIPs = QtConcurrent::blockingMapped<QList<bool>>(possibleIPs, [](const QString& currIp)->bool {
            return QProcess::execute("ping", QStringList() <<
                             #ifdef Q_OS_WIN
                                     QStringLiteral("-n 1")
                             #else
                                     QStringLiteral("-c 1")
                             #endif
                                     << currIp) == 0;
        });
    }
    

    QtConcurrent non l'ho mai usato ancora ad essere sincero, quindi non riesco a capire bene dove sia l'errore!


  • Qt Champions 2018

    Hai aggiunto QT += concurrent al .pro file e re-runnato qmake?

    Lo puoi fare anche con solo C++11 in realta':

    QList<quint8> availableIPs(quint8 ip1, quint8 ip2, quint8 ip3)
    {
        std::array<std::future<bool>,256> ipList;
        for (int i = 0; i < 256; i++)
            ipList[i] = std::async(std::launch::async,
            [](const QString& currIp)->bool {
            return QProcess::execute("ping", QStringList() << currIp <<
    #ifdef Q_OS_WIN
                QStringLiteral("-n")
    #else
                QStringLiteral("-c")
    #endif
                << QStringLiteral("1")) == 0;
        }
        , QStringLiteral("%1.%2.%3.%4").arg(ip1).arg(ip2).arg(ip3).arg(i));
    
        QList<quint8> result;
        for (int i = 0; i < ipList.size();++i){
            if (ipList[i].get())
                result << i;
        }
        return result;
    }
    

  • Qt Champions 2018

    per la cronanca l'ho testato e, nonostante sia veloce, su windows non funziona perche' ping ritorna sempre 0. Devi metterti a leggere lo standard output e applicare un QRegularExpression per vedere quanti sono Received =



  • ciao!

    questo il mio file .pro:

    QT       += core gui network concurrent
    

    ho lanciato qmake più volte.
    ma continuo ad avere quegli errori!


Log in to reply