3

Qprocess を使用して ping を実行し、ホストがオンラインかどうかを確認しています...

問題は、Qprocess->finished シグナルから受信した終了コードが、到達可能なホストまたは到達不能なホストに ping を送信しても、常に 2 であることです。

QTimerでホストに継続的にpingしています(Qtアプリが実行されているクライアントにマウントした1つのフォルダー)...

QProcess->finished シグナルに接続されたスロットで ping によって返された終了コードをキャッチすると、常に 2 として終了コードを受け取ります。

pingがアクティブな間、アプリがハングするため、システム(ping)を介した直接システムコールを使用できません...非同期にしたいので、QProcessに切り替えました...

以下はコード スニペットです。

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

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

1.1.1.1がpingされているか、1.1.1.11が端末でpingされているかに関係なく、行は常に出力として2,0を提供しますアプリがそれに応じて動作できるように、オンライン/オフラインのホストをシミュレートします)

どんな入力でも大きな助けになります..

ありがとう。

4

3 に答える 3

6

文書化されていないため、ping.exe の終了コードに依存するのは悪い習慣だと思います。さらに、異なるバージョンの Windows では終了コードに一貫性がないことが知られています。

あなたは出来る:

  • 独自の ping を実装します。このような無料の実装がたくさんあります(Google で「ping.c」を検索したときの最初の実装)。
  • ping.exe の出力を解析し、ping が成功したかどうかを判断します。

編集:

Linux を使用していることに気がつきませんでした (次回は、質問で言及する方が賢明かもしれません)...

引数をpingに送信するときにこれを試してください:

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

1 つの大きな文字列の代わりに。

于 2009-06-27T08:57:54.893 に答える
1

これを行うための適切なクロスプラットフォームの方法はありません。ただし、プラットフォーム固有の方法を使用できます。これを使用して、Windows と Linux の両方で ping を実行できます。

#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
}
于 2014-06-14T06:38:54.083 に答える
0

ping->start の代わりに ping->execute (int を返す) を使用できます。わたしにはできる !!!

ウラジヨルク

于 2009-12-22T21:16:58.537 に答える