запуск ping с Qprocess, код выхода всегда 2, если хост доступен или нет - PullRequest
3 голосов
/ 27 июня 2009

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

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

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

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

Я не могу использовать прямой системный вызов через систему (пинг), так как он зависает в моем приложении, пока пинг активен ... я хочу, чтобы он был асинхронным, поэтому я переключился на 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 - pingable, а 1.1.1.11 - нет (я переключаю bw ips через флаг dBool, который устанавливается для события нажатия клавиши, чтобы имитировать онлайн / офлайн хост, чтобы мое приложение могло вести себя соответственно)

Любые входные данные будут очень полезны ..

Спасибо.

Ответы [ 3 ]

6 голосов
/ 27 июня 2009

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

Вы могли бы:

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

EDIT:

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

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

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

вместо одной большой строки.

1 голос
/ 14 июня 2014

Нет хорошего кроссплатформенного способа сделать это. Но вы можете использовать платформо-специфичные способы. Вы можете пропинговать как 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
}
0 голосов
/ 23 декабря 2009

Вы можете использовать ping-> execute (return int) вместо ping-> start. У меня это работает !!!

Vladiyork

...