eseguendo il ping con Qprocess, il codice di uscita è sempre 2 se l'host è raggiungibile o meno
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.
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