Frage

i QProcess bin mit ping ausführen zu überprüfen, für ein Host-Online oder nicht zu sein ...

Das Problem ist, dass der Exit-Code, die ich aus dem Qprocess- empfange> fertiges Signal ist immer 2 egal, ob ich einen erreichbaren Host oder einen unerreichbaren eine ping ..

Ich bin Pingen kontinuierlich in einem QTimer an einen Host (dessen einen Ordner i am Client montiert sind, wo die Qt App läuft) ...

wenn ich den Exit-Code fange, wie durch Ping in einem Schlitz verbunden QProcess-> fertiges Signal .. i immer recieve Exit-Code als 2 zurück ..

i cant direkten Systemaufruf durch das System (ping) verwenden, da es meine app für die Zeit hängt Ping aktiv ist ... ich will es asynchron sein, so i geschaltet QProcess ...

das folgende ist der Code-Snippet:

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

die

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

Zeile gibt immer 2,0 als Ausgang egal ob 1.1.1.1 ist pinged oder 1.1.1.11 pinged ist 1.1.1.1 auf Terminal pingable ist und 1.1.1.11 ist nicht (i wechseln bw ips durch dBool Flag, das auf Tastendruck-Ereignis gesetzt ist online / offline-Host zu simulieren, so dass meine App entsprechend verhalten können)

Jede Eingänge wäre eine große Hilfe sein ..

Danke.

War es hilfreich?

Lösung

Ich denke, es ist eine schlechte Praxis auf ping.exe Exit-Code zu verlassen, wie es nicht dokumentiert ist. Außerdem ist es bekannt, dass der Exit-Code in verschiedenen Versionen von Windows inkonsistent ist.

Sie könnten:

  • realisieren einen eigenen Ping. es gibt viele freie Implementierungen gibt, wie diese (erster, wenn "ping.c" in google-Suche).
  • analysieren ping.exe Ausgang und bestimmen, ob die Ping-Test erfolgreich war oder nicht.

EDIT:

Haben Sie nicht erkennen, Sie arbeiten mit Linux (das nächste Mal könnte es klüger sein, es in Ihrer Frage ganz zu schweigen) ...

Versuchen Sie dieses, wenn die Argumente Ping Senden:

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

statt einer großen Zeichenfolge.

Andere Tipps

Es ist kein guter Cross-Plattform-Weg, dies zu tun. Aber Sie können plattformspezifische Weise nutzen. Sie können auf ping sowohl Windows als auch Linux dies mit:

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

Sie können mit Ping-> execute (return int) statt Ping-> starten. Es funktioniert für mich !!!

Vladiyork

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top