executar ping com os QProcess, código de saída sempre 2 se hospedar alcançável ou não

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

  •  20-08-2019
  •  | 
  •  

Pergunta

Eu estou usando QProcess para executar ping para verificar se há uma série de estar online ou não ...

O problema é que o código de saída que eu recebo do Qprocess-> sinal acabado é sempre 2 não importa se eu executar ping um host acessível ou um um inacessível ..

Estou continuamente ping em um QTimer a um host (cuja uma pasta i ter montado a cliente onde o aplicativo Qt está sendo executado) ...

i quando apanhar o código de saída como retornado por pingue numa ranhura ligada ao QProcess-> sinal acabado .. i sempre Recieve código de saída como 2 ..

eu não posso usar chamada de sistema direto através do sistema (ping) como ele trava meu aplicativo para o tempo de ping está ativo ... eu quero que ele seja assíncrona, então eu mudei para QProcess ...

A seguir está o trecho de código:

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

o

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

linha sempre dá 2,0 como saída, não importa se 1.1.1.1 é pingado ou 1.1.1.11 é pingado no terminal 1.1.1.1 é pingable e 1.1.1.11 não é (i mudar ips BW através bandeira dBool que está definido no evento de teclado para simular on-line / host offline para que meu aplicativo pode se comportar em conformidade)

Qualquer entradas seria uma grande ajuda ..

Graças.

Foi útil?

Solução

Eu acho que é uma má prática de contar com código de saída ping.exe como é documentado. Além disso, é conhecido que, em diferentes versões do Windows o código de saída é inconsistente.

Você pode:

  • implementar seu próprio ping. há muitas implementações livres lá fora, como este (primeiro na pesquisa "ping.c" no google).
  • saída ping.exe de análise e determinar se o ping foi bem sucedido ou não.

EDIT:

Será que não percebem que você está trabalhando com o Linux (na próxima vez que poderia ser mais sensato para mencioná-lo na sua pergunta) ...

Tente isto ao enviar os argumentos para ping:

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

em vez de uma grande string.

Outras dicas

Não é uma boa maneira de plataforma cruzada para fazer isso. Mas você pode usar caminhos específicos da plataforma. Você pode executar ping em Windows e Linux usando o seguinte:

#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
}

Você pode usar pingue-> execute (int retorno) em vez de pingue-> começar. Ele funciona para mim !!!

Vladiyork

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top