2009-06-27 8 views
3

j'utilise QProcess pour exécuter ping pour vérifier un hôte à être en ligne ou non ...fonctionnement ping avec QProcess, code de sortie toujours 2 si l'hôte accessible ou non

Le problème est que le code de sortie que je recevoir du signal Qprocess-> terminé est toujours 2 peu importe si je ping sur un hôte accessible ou inaccessible ..

Je suis ping continuellement dans un QTimer à un hôte (dont un dossier j'ai monté au client où le Qt application est en cours d'exécution) ...

lorsque j'attrape le code de sortie comme renvoyé par ping dans un slot connecté à QProcess-> terminé signal .. je reçois toujours code de sortie en tant que 2 ..

Je ne peux pas utiliser l'appel système direct par le biais du système (ping) car il bloque mon application pour le temps ping est actif ... je veux qu'il soit asynchrone, donc je suis passé à QProcess ...

ce qui suit est l'extrait de code:

//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"; 
    } 
} 

le

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

ligne donne toujours 2,0 en sortie peu importe si 1.1.1.1 est ou 1.1.1.11 est un ping cinglé sur le terminal 1.1.1.1 est pingable et 1.1.1.11 n'est pas (je change bw ips par l'indicateur dBool qui est placé sur l'événement keypress pour simuler l'hôte en ligne/hors ligne afin que mon application puisse se comporter en conséquence)

être une grande aide ..

Merci.

+0

liés: http://stackoverflow.com/questions/4629185/launch-and-write-to-terminal-in-qt –

Répondre

6

Je pense que c'est une mauvaise pratique de s'appuyer sur le code de sortie ping.exe car il n'est pas documenté. En outre, il est connu que dans différentes versions de Windows, le code de sortie est incohérent.

Vous pouvez:

  • implémenter votre propre ping. il y a beaucoup d'implémentations libres là-bas comme this (le premier lors de la recherche "ping.c" dans google).
  • analyse la sortie ping.exe et détermine si le ping a réussi ou non.

EDIT:

ne savais pas que vous travaillez avec Linux (la prochaine fois, il pourrait être plus sage de le mentionner dans votre question) ...

Essayez quand envoyer les arguments ping:

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

au lieu d'une grande chaîne.

+0

juste pour compléter mon point ... im sur Linux. – ashishsony

+0

Merci daniel ... ce fut l'erreur exacte maintenant je reçois le code d'erreur correct ... Merci une tonne encore une fois .. :) – ashishsony

+0

daniel ... l'erreur était la façon dont je remplissais les params QStringList .. u étaient correctes car il était nécessaire de l'insérer en tant que paramètres séparés..params << "1.1.1.11" << "-i" << "1" << "-w" << "1" << "-c" << "1"; et s'il vous plaît ré-éditer pour inclure cette ligne dans votre réponse .. et par la façon dont j'ai déjà consulté la page ping man ... quel code d'erreur à rechercher était clair pour moi ... juste je n'obtenais pas les codes reqd correctement .. – ashishsony

0

Vous pouvez utiliser ping-> execute (return int) au lieu de ping-> start. Ca marche pour moi !!!

Vladiyork

1

Il n'y a pas une bonne façon de cross plate-forme pour le faire. Mais vous pouvez utiliser des moyens spécifiques à la plate-forme.Vous pouvez faire un ping sur Windows et Linux en utilisant ceci:

#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 
} 
Questions connexes