2009-06-27 10 views
3

我使用QProcess中執行ping命令檢查的主機在線或不...運行ping與QProcess中,退出代碼總是2,如果主機可達或不

的問題是退出代碼,我接收從Qprocess->完成信號總是2無論我ping一個可達主機或無法訪問一個..

我一直在一個QTimer ping主機(其中一個文件夾我已經安裝在客戶端, 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被執行ping操作或1.1.1.11是在終端1.1.1.1上ping到 是可ping通的,並且1.1.1.11不是(我通過在keypress事件上設置的dBool標誌來模擬在線/離線主機,以便我的應用可以相應地運行)

任何輸入是一個很好的幫助..

謝謝。

+0

相關:http://stackoverflow.com/questions/4629185/launch-and-write-to-terminal-in-qt – 2011-02-09 20:07:16

回答

6

我認爲依賴ping.exe退出代碼是一種糟糕的做法,因爲它沒有記錄。此外,衆所周知,在不同版本的Windows中,退出代碼不一致。

,你可以:

  • 實現自己的平安。這裏有很多免費的實現,例如this(在google中搜索「ping.c」時的第一個)。
  • 解析ping.exe輸出並確定ping是否成功。

編輯:

沒有意識到你正在使用Linux(下一次可能是比較明智​​的提到它在你的問題)......

發送的參數時,試試這個ping:

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

而不是一個大字符串。

+0

只是爲了完成我的觀點...即時通訊在Linux上。 – ashishsony 2009-06-27 09:04:26

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 
} 
相關問題