executar ping com os QProcess, código de saída sempre 2 se hospedar alcançável ou não
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.
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