Qprocess で ping を実行すると、ホストに到達できるかどうかにかかわらず、終了コードは常に 2 になります。
質問
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