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

IP scanner

Scheduled Pinned Locked Moved Unsolved Italian
11 Posts 3 Posters 3.9k Views
  • 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