en cours d'exécution de ping avec Qprocess, code de sortie toujours 2 si l'hôte est accessible ou non

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

  •  20-08-2019
  •  | 
  •  

Question

J'utilise Qprocess pour exécuter un ping afin de vérifier si un hôte est en ligne ou non ...

Le problème est que le code de sortie que je reçois du processus Q - & Le signal terminé est toujours égal à 2, peu importe si je lance un ping sur un hôte accessible ou inaccessible ..

Je clique constamment dans un QTimer sur un hôte (dont le dossier que j'ai monté sur le client sur lequel l'application Qt est en cours d'exécution) ...

quand j'attrape le code de sortie renvoyé par ping dans un emplacement connecté à QProcess - > signal terminé .. je reçois toujours le code de sortie sous la forme 2 ..

Je ne peux pas utiliser d'appel système direct via le système (ping) car il bloque mon application pour le moment où le ping est actif ... Je veux que ce soit asynchrone, alors je suis passé à QProcess ...

Voici 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
La ligne

donne toujours 2,0 en sortie, peu importe si 1.1.1.1 est envoyé ou 1.1.1.11 si envoyé. sur le terminal 1.1.1.1, c’est pingable et pas 1.1.1.11 (i permute bw ips via l’indicateur dBool défini sur l’événement de frappe pour simuler un hôte en ligne / hors ligne afin que mon application puisse se comporter en conséquence)

Toute entrée serait d'une grande aide.

Merci.

Était-ce utile?

La solution

Je pense que c’est une mauvaise pratique de s’appuyer sur le code de sortie ping.exe car il n’est pas documenté. De plus, on sait que le code de sortie est incohérent dans différentes versions de Windows.

Vous pourriez:

  • implémentez votre propre ping. il existe de nombreuses implémentations gratuites, telles que this (le premier lors de la recherche & "; ping.c &"; dans Google).
  • analyser la sortie de ping.exe et déterminer si le ping a réussi ou non.

EDIT:

Vous n'avez pas compris que vous travailliez avec Linux (la prochaine fois, il serait peut-être plus sage de le mentionner dans votre question) ...

Essayez ceci lors de l'envoi des arguments à ping:

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

au lieu d'une grosse chaîne.

Autres conseils

Il n’existe pas de solution multi plate-forme pour ce 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
}

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

Vladiyork

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top