IP scanner
-
@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; }