qprocess로 ping을 실행, 종료 코드 항상 2 호스트에 도달 할 수 있는지 여부

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

  •  20-08-2019
  •  | 
  •  

문제

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top