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??



  • 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.



  • 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!



  • 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;
    }
    


  • 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
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.