Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Italian
  4. IP scanner
Qt 6.11 is out! See what's new in the release blog

IP scanner

Scheduled Pinned Locked Moved Unsolved Italian
11 Posts 3 Posters 5.8k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • F Offline
    F Offline
    fermatqt
    wrote on last edited by
    #1

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

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #2

      che sistema operativo usi?

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      1 Reply Last reply
      0
      • F Offline
        F Offline
        fermatqt
        wrote on last edited by
        #3

        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!

        1 Reply Last reply
        0
        • mrdebugM Offline
          mrdebugM Offline
          mrdebug
          wrote on last edited by
          #4

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

          Need programmers to hire?
          www.labcsp.com
          www.denisgottardello.it
          GMT+1
          Skype: mrdebug

          F 1 Reply Last reply
          1
          • mrdebugM mrdebug

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

            F Offline
            F Offline
            fermatqt
            wrote on last edited by
            #5

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

            1 Reply Last reply
            0
            • F Offline
              F Offline
              fermatqt
              wrote on last edited by
              #6

              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.

              1 Reply Last reply
              0
              • VRoninV Offline
                VRoninV Offline
                VRonin
                wrote on last edited by VRonin
                #7

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

                "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                ~Napoleon Bonaparte

                On a crusade to banish setIndexWidget() from the holy land of Qt

                1 Reply Last reply
                0
                • F Offline
                  F Offline
                  fermatqt
                  wrote on last edited by
                  #8

                  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!

                  VRoninV 1 Reply Last reply
                  0
                  • F fermatqt

                    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!

                    VRoninV Offline
                    VRoninV Offline
                    VRonin
                    wrote on last edited by VRonin
                    #9

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

                    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                    ~Napoleon Bonaparte

                    On a crusade to banish setIndexWidget() from the holy land of Qt

                    1 Reply Last reply
                    0
                    • VRoninV Offline
                      VRoninV Offline
                      VRonin
                      wrote on last edited by VRonin
                      #10

                      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 =

                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                      ~Napoleon Bonaparte

                      On a crusade to banish setIndexWidget() from the holy land of Qt

                      1 Reply Last reply
                      0
                      • F Offline
                        F Offline
                        fermatqt
                        wrote on last edited by
                        #11

                        ciao!

                        questo il mio file .pro:

                        QT       += core gui network concurrent
                        

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

                        1 Reply Last reply
                        0

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved