2009-06-27 11 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 
} 
相关问题