eseguendo il ping con Qprocess, il codice di uscita è sempre 2 se l'host è raggiungibile o meno

StackOverflow https://stackoverflow.com/questions/1052411

  •  20-08-2019
  •  | 
  •  

Domanda

Sto usando Qprocess per eseguire il ping per verificare che un host sia online o meno ...

Il problema è che il codice di uscita che ricevo da Qprocess - > il segnale finito è sempre 2, non importa se eseguo il ping di un host raggiungibile o di uno irraggiungibile ..

Eseguo il ping continuo di un QTimer a un host (di cui ho installato una cartella sul client in cui è in esecuzione l'app Qt) ...

quando prendo il codice di uscita come restituito dal ping in uno slot collegato a QProcess - > segnale finito .. ricevo sempre il codice di uscita come 2 ..

Non posso usare la chiamata diretta di sistema attraverso il sistema (ping) in quanto blocca la mia app per il tempo in cui il ping è attivo ... voglio che sia asincrono, quindi sono passato a QProcess ...

il seguente è lo snippet di codice:

//Pinging function called inside a timer with timout 1000        
QString exec="ping";
        QStringList params;
        if(!dBool)
        {
            //params << "-c1 1.1.1.11 -i1 -w1;echo $?";
            params <<" 1.1.1.11 -i 1 -w 1 -c 1";//wont ping
            cout<<"\n\npinging 11 ie wont ping";
        }
        else
        {
            //params << "-c1 1.1.1.1 -i1 -w1;echo $?";
            params <<" 1.1.1.1 -i 1 -w 1 -c 1";//will ping
            cout<<"\n\npinging 1 ie will ping";
        }
        ping->start(exec,params);
// the slot that connects with QProcess->finished signal
void QgisApp::pingFinished( int exitCode, QProcess::ExitStatus exitStatus )
{
    cout<<"\n\nexitCode,exitStatus=="<<exitCode<<","<<exitStatus;//always 2,0!!
    if(exitCode==0)
    //if(dBool)
    {
        connectivity=true;
        cout<<"\n\nONLINE";
    }
    else
    {
        connectivity=false;
        cout<<"\n\nOFFLINE";
    }
}   

il

cout<<"\n\nexitCode,exitStatus=="<<exitCode<<","<<exitStatus
La riga

fornisce sempre 2,0 come output, indipendentemente dal fatto che 1.1.1.1 sia sottoposto a ping o 1.1.1.11 sia eseguito il ping sul terminale 1.1.1.1 è pingabile e 1.1.1.11 no (cambio bw ips tramite il flag dBool impostato sull'evento keypress per simulare l'host online / offline in modo che la mia app possa comportarsi di conseguenza)

Qualsiasi input sarebbe di grande aiuto ..

Grazie.

È stato utile?

Soluzione

Penso che sia una cattiva pratica fare affidamento sul codice di uscita ping.exe poiché non è documentato. Inoltre, è noto che nelle diverse versioni di Windows il codice di uscita è incoerente.

Potresti:

  • implementa il tuo ping. ci sono molte implementazioni gratuite là fuori come this (il primo quando si cerca " ping.c " in google).
  • analizza l'output ping.exe e determina se il ping ha avuto esito positivo o meno.

EDIT:

Non hai realizzato che stai lavorando con Linux (la prossima volta potrebbe essere più saggio menzionarlo nella tua domanda) ...

Prova questo quando invii gli argomenti al ping:

params << "1.1.1.11" << "-i" << "1" << "-w" << "1" <<"-c" <<"1";

invece di una grande stringa.

Altri suggerimenti

Non esiste un buon metodo multipiattaforma per farlo. Ma puoi usare modi specifici della piattaforma. Puoi eseguire il ping su Windows e Linux usando questo:

#if defined(WIN32)
   QString parameter = "-n 1";
#else
   QString parameter = "-c 1";
#endif

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

Puoi usare ping - > execute (return int) invece di ping - > start. Funziona per me !!!

Vladiyork

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top