2014-04-08 2 views
8

Derzeit verwende ich diesen Code zum Abrufen des Ping eines Zielsystems. Allerdings funktioniert es bisher nur unter Linux und es hängt wahrscheinlich von den Gebietsschemaeinstellungen ab. Um Unterstützung für Windows hinzuzufügen, wird wahrscheinlich noch komplizierter. Gibt es einen einfachen Weg oder eine Bibliothek, um den Ping eines Zielsystems zu erhalten? Ich arbeite hauptsächlich mit Qt, also wäre es ideal, wenn ich mit QSockets arbeiten könnte.Holen Sie den Ping von einem Remote-Ziel mit Qt (Windows/Linux)

#ifndef _WIN32 
QProcess ping; 
ping.start("ping", QStringList() << "-c 1" << m_sHostName); 
if(ping.waitForFinished(250)) { 
    while(ping.canReadLine()) { 
     QString line = ping.readLine(); 
     if(line.contains("time=")) { 
      int iStart = line.indexOf("time=") + 5; 
      int iStop = line.indexOf(" ms"); 
      QStringRef latency(&line, iStart, iStop-iStart); 

      m_vNetwork_s.append(time_s); 
      m_vLatency_ms.append(QString(latency.toLocal8Bit()).toDouble()); 
      break; 
     } 
    } 
} 
#endif 
+0

In Bezug auf ICMP mit Qt, fand ich diesen Link: http://lists.qt-project.org/pipermail/interest/2013-Januar/005746.html Sieht aus wie Sie es mit Qt Netzwerkklassen –

Antwort

2

Sie würden Ihr Code für diese ohne QAbstractSocket müssen schreiben. Kurz gesagt, diese Basisklasse wurde nicht für diesen Anwendungsfall entwickelt.

Der Grund ist, dass Sie rohe Sockets verwenden und als root ausführen müssen; Das ist auch der Grund, warum Sie normalerweise das setuid-Flag in der ausführbaren Ping-Datei von Linux sehen.

ICMP ist „verbindungslos“, und als solche die Qt-Klasse nicht machbar ist, da es liefert keine Daten an einen bestimmten Host zu senden, usw.

Sie können in here die gründlichere Erklärung lesen.

11

Sie können ping sowohl Windows als auch Linux dies mit:

QStringList parameters; 
#if defined(WIN32) 
    parameters << "-n" << "1"; 
#else 
    parameters << "-c 1"; 
#endif 

    parameters << m_sHostName; 

    int exitCode = QProcess::execute("ping", parameters); 
    if (exitCode==0) { 
     // it's alive 
    } else { 
     // it's dead 
    } 
+1

nicht tun können Problem bei diesem Ansatz ist, dass ich einen Parser für die Kommandozeilenausgabe für jede Sprache des Hostsystems definieren müsste. Darüber hinaus gibt es einen Overhead mit dieser Methode und es könnte (aus welchen Gründen auch immer) sperren. Ich persönlich hasse diese Methode so sehr! Auf der anderen Seite war ich nicht bereit, eine solche Ping-Pong-Methode selbst zu implementieren, denn theoretisch sollte es auf den meisten Systemen bereits Lösungen geben. – dgrat

+1

Der angegebene Code gibt nur einen Exit-Code zurück, sodass Sie die Ausgabe nicht analysieren müssen. Es kann auch auf ein Gewinde gesetzt werden, um ein Blockieren zu vermeiden. – Nejat

+0

Aber Sie müssen die * ms trotzdem parsen, wenn Sie den Ping in ms plotten wollen. Der Ausgangsstatus ist nicht die Verzögerung in ms. – dgrat

6

Nejats Code funktionierte bei mir auch nicht. Vielleicht ist es Windows-spezifisch (getestet unter Windows 7 x64 + Qt 5.6). Der Ping-Befehl scheint Parameter und Werte zu unterscheiden und benötigt sie beim Erstellen von QProcess.

Anstatt "-n 1" auf einmal zu übergeben, müssen Sie "-n" und "1" getrennt übergeben.

Grundsätzlich mit Nejat Code wäre es:

int exitCode = QProcess::execute("ping", QStringList() 
            << "-n" << "1" 
            << m_sHostName); 
if (exitCode==0) { 
    // it's alive 
} else { 
    // it's dead 
} 

Getestet und funktioniert jetzt.

Verwandte Themen