qprocess로 ping을 실행, 종료 코드 항상 2 호스트에 도달 할 수 있는지 여부
문제
QProcess를 사용하여 핑을 실행하여 호스트가 온라인 상태인지 확인하고 있습니다 ...
문제는 QProcess-> 완성 된 신호에서받는 종료 코드가 도달 가능한 호스트를 핑하거나 도달 할 수없는 호스트를 핑하든 항상 2라는 것입니다.
QTIMER에서 호스트 (QT 앱이 실행중인 클라이언트에 장착 한 폴더 하나)에 지속적으로 핑하고 있습니다.
QProcess-> 완성 된 신호에 연결된 슬롯에서 Ping에 의해 반환 된 출구 코드를 잡을 때 .. 나는 항상 종료 코드를 2로받습니다.
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.1.1.11이 터미널 1.1.1.1에 핑이 핑 가능한 상태이고 1.1.1.11이 아닙니다 (Keypress 이벤트에서 설정된 DBOOL 플래그를 통해 BW IPS를 전환하는 경우 1.1.1.11이 핑이 핑되는 경우 라인은 항상 2,0을 제공합니다. 내 앱이 그에 따라 행동 할 수 있도록 온라인/오프라인 호스트 시뮬레이션)
모든 입력은 큰 도움이 될 것입니다 ..
감사.
해결책
문서화되지 않은 Ping.exe 출구 코드에 의존하는 것은 나쁜 관행이라고 생각합니다. 또한 다른 버전의 Windows에서 종료 코드가 일관되지 않는 것으로 알려져 있습니다.
당신은 할 수 있습니다 :
- 나만의 핑을 구현하십시오. 다음과 같은 무료 구현이 많이 있습니다 이것 (Google에서 "Ping.c"를 검색 할 때 첫 번째).
- ping.exe 출력을 구문 분석하고 핑이 성공했는지 여부를 결정하십시오.
편집하다:
당신이 Linux와 함께 일하고 있다는 것을 몰랐습니다 (다음에 질문에서 언급하는 것이 더 현명 할 수 있습니다) ...
인수를 핑에 보낼 때 이것을 시도하십시오.
params << "1.1.1.11" << "-i" << "1" << "-w" << "1" <<"-c" <<"1";
하나의 큰 문자열 대신.
다른 팁
이 작업을 수행하는 좋은 크로스 플랫폼 방법은 없습니다. 그러나 플랫폼 특정 방법을 사용할 수 있습니다. 이것을 사용하여 Windows와 Linux를 모두 핑할 수 있습니다.
#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-> start 대신 ping-> execute (return int)를 사용할 수 있습니다. 그것은 나를 위해 작동합니다 !!!
Vladiyork