запускаю ping с Qprocess, код выхода всегда 2, доступен хост или нет

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

  •  20-08-2019
  •  | 
  •  

Вопрос

я использую Qprocess для выполнения ping, чтобы проверить, подключен ли хост к сети или нет...

Проблема в том, что код выхода, который я получаю из сигнала Qprocess-> finished, всегда равен 2, независимо от того, пингую ли я доступный хост или недоступный..

Я постоянно отправляю пинг в QTimer на хост (единственную папку которого я смонтировал на клиенте, где запущено приложение Qt)...

когда я улавливаю код выхода, возвращаемый ping в слоте, подключенном к QProcess-> finished signal..я всегда получаю код выхода как 2..

я не могу использовать прямой системный вызов через system (ping), так как это зависает в моем приложении на время активного 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

строка всегда выдает 2,0 в качестве выходных данных независимо от того, пропингован ли 1.1.1.1 или 1.1.1.11 на терминале 1.1.1.1 возможен пинг, а 1.1.1.11 - нет (я переключаю bw ip-адреса с помощью флага dBool, который устанавливается при событии нажатия клавиши, для имитации сетевого / автономного хоста, чтобы мое приложение могло вести себя соответствующим образом)

Любые входные данные были бы большим подспорьем..

Спасибо.

Это было полезно?

Решение

Я думаю, что полагаться на плохую практику ping.exe завершите работу с кодом, поскольку он недокументирован.Кроме того, было известно, что в разных версиях Windows код выхода противоречив.

Ты мог бы:

  • реализуйте свой собственный ping.существует множество бесплатных реализаций, таких как это (первый при поиске "ping.c" в Google).
  • проанализируйте ping.exe выведите данные и определите, был ли пинг успешным или нет.

Редактировать:

Не знал, что вы работаете с Linux (в следующий раз, возможно, было бы разумнее упомянуть об этом в вашем вопросе)...

Попробуйте это при отправке аргументов в ping:

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-> execute (возвращает int) вместо ping->start.У меня это работает !!!

Vladiyork

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top