ejecutando ping con Qprocess, el código de salida siempre es 2 si el host es accesible o no

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

  •  20-08-2019
  •  | 
  •  

Pregunta

Estoy usando Qprocess para ejecutar ping para verificar si un host está en línea o no ...

El problema es que el código de salida que recibo del Qprocess - > la señal de finalización siempre es 2, sin importar si hago ping a un host accesible o inalcanzable ...

Estoy continuamente haciendo ping en un QTimer a un host (cuya carpeta he montado en el cliente donde se ejecuta la aplicación Qt) ...

cuando capturo el código de salida devuelto por ping en una ranura conectada a QProcess - > señal finalizada ... siempre recibo el código de salida como 2 ...

no puedo usar la llamada directa del sistema a través del sistema (ping) ya que bloquea mi aplicación por el tiempo que el ping está activo ... quiero que sea asíncrono, así que cambié a QProcess ...

el siguiente es el fragmento 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";
    }
}   

el

cout<<"\n\nexitCode,exitStatus=="<<exitCode<<","<<exitStatus
La línea

siempre da 2,0 como salida, sin importar si 1.1.1.1 está pinchado o 1.1.1.11 está pinchado en el terminal 1.1.1.1 se puede hacer ping y 1.1.1.11 no (cambio bw ips a través del indicador dBool que se establece en el evento de pulsación de tecla para simular el host en línea / fuera de línea para que mi aplicación pueda comportarse en consecuencia)

Cualquier entrada sería de gran ayuda ...

Gracias.

¿Fue útil?

Solución

Creo que es una mala práctica confiar en el código de salida ping.exe ya que no está documentado. Además, se sabe que en diferentes versiones de Windows el código de salida es inconsistente.

Podrías:

  • implementa tu propio ping. hay muchas implementaciones gratuitas, como esto (primero al buscar " ping.c " en google).
  • analizar la salida de ping.exe y determinar si el ping fue exitoso o no.

EDITAR:

No me di cuenta de que está trabajando con Linux (la próxima vez podría ser más inteligente mencionarlo en su pregunta) ...

Pruebe esto cuando envíe los argumentos a ping:

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

en lugar de una cadena grande.

Otros consejos

No hay una buena forma multiplataforma para hacer esto. Pero puede usar formas específicas de la plataforma. Puede hacer ping tanto en Windows como en Linux usando esto:

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

Puede usar ping - > execute (return int) en lugar de ping - > start. ¡Funciona para mí!

Vladiyork

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top