2009-06-27 7 views
3

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

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

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

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

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

Любые входы быть большой помощью ..

Спасибо.

+0

, связанные с: http://stackoverflow.com/questions/4629185/launch-and-write-to-terminal-in-qt –

ответ

6

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

Вы могли:

  • реализовать свой собственный пинг. существует множество бесплатных реализаций, таких как this (первый при поиске «ping.c» в google).
  • Вывести вывод ping.exe и определить, был ли ping успешным или нет.

EDIT:

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

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

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

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

+0

просто завершить свою точку ... im на linux. – ashishsony

+0

Спасибо daniel ... это была точная ошибка, теперь я получаю правильный код ошибки ... Спасибо тонну еще раз .. :) – ashishsony

+0

daniel ... ошибка была в том, как я заполнял параметры QStringList .. u были правильны, поскольку требовалось вставить его в виде отдельных параметров .. params << "1.1.1.11" << "-i" << "1" << "-w" << "1" << "-c" << "1"; пожалуйста, заново отредактируйте, чтобы включить эту строку в ответ ур. и, кстати, я уже консультировался с страницей ping man ... какой код ошибки для поиска был ясен для меня ... просто я не получал коды reqd правильно .. – ashishsony

0

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

Vladiyork

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 
}