Qprocess で ping を実行すると、ホストに到達できるかどうかにかかわらず、終了コードは常に 2 になります。

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

  •  20-08-2019
  •  | 
  •  

質問

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

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

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

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

pingがアクティブな間アプリがハングするため、system(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.1がpingされているか、1.1.1.11がターミナル1.1.1.1がpingで、1.1.1.11が1.1.1.11であるかに関係なく、出力としてラインは常に2,0を与えます(キープレスイベントに設定されたDBOOLフラグからBW IPSを切り替えます。オンライン/オフラインのホストをシミュレートするように、私のアプリがそれに応じて動作できるように)

あらゆる入力が非常に役立ちます。

ありがとう。

役に立ちましたか?

解決

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

あなたは出来る:

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

編集:

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

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

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

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
}

あなたはping->代わりにping->スタートの(リターンint)を実行することができます。 それは私のために動作します!!!

Vladiyork

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top