2014-04-08 6 views
8

Attualmente utilizzo questo codice per recuperare il ping di un sistema di destinazione. Tuttavia funziona fino ad ora solo sotto Linux ed è probabilmente dipendente dalle impostazioni locali. Per aggiungere il supporto per Windows sarà probabilmente ancora più complicato. C'è un modo semplice o una libreria per ottenere il ping di un sistema di destinazione? Lavoro principalmente con Qt, quindi sarebbe l'ideale se potessi lavorare con QSockets.Ottieni il ping da una destinazione remota con 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

Per quanto riguarda ICMP con Qt, ho trovato questo link: http://lists.qt-project.org/pipermail/interest/2013-January/005746.html Sembra che tu non possa farlo con le classi di rete di Qt –

risposta

2

Si avrebbe bisogno di scrivere il codice per questo senza QAbstractSocket. In breve, questa classe base non è stata progettata per questo caso d'uso.

Il motivo è che è necessario utilizzare i socket non elaborati ed eseguire come root; questo è anche il motivo per cui di solito vedi il flag setuid impostato sul ping eseguibile su Linux.

ICMP è "senza connessione", e come tale la classe Qt non è fattibile per come esso non prevede l'invio di dati a un host specifico, ecc

È possibile leggere la spiegazione più approfondita in here.

11

È possibile eseguire il ping sia su Windows e Linux utilizzando questo:

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

The problema su questo approccio è che dovrei definire un parser per l'output della riga di comando per ogni lingua del sistema host. Inoltre c'è un sovraccarico con questo metodo e potrebbe bloccare (per quali ragioni mai). Odio personalmente questo metodo così tanto! D'altra parte non ero disposto a implementare un tale metodo di ping pong da solo, perché teoricamente ci dovrebbero essere già soluzioni sulla maggior parte dei sistemi. – dgrat

+1

Il codice indicato restituisce solo un codice di uscita, quindi non è necessario analizzare l'output. Inoltre può essere messo su un filo per evitare il blocco. – Nejat

+0

Ma è necessario analizzare il * ms in ogni caso se si desidera tracciare il ping in ms. Lo stato di uscita non è il ritardo in ms. – dgrat

6

Il codice di Nejat non ha funzionato neanche per me. Forse è specifico per Windows (testato su Windows 7 x64 + Qt 5.6). Il comando ping sembra avere parametri e valori distinti e richiede che vengano separati durante la creazione di QProcess.

Quindi, anziché passare "-n 1" in una volta, è necessario passare "-n" e "1" separatamente.

In sostanza, con il codice di Nejat sarebbe:

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

Testato e funzionante ora.

Problemi correlati