我正在使用Qprocess执行ping以检查主机是否在线...
问题是我从Qprocess->完成信号中接收的退出代码总是2,无论我是否ping可达主机或无法访问的主机...
我一直在QTimer中ping一个主机(我在运行Qt应用程序的客户端安装了一个文件夹)......
当我在连接到QProcess->完成信号的插槽中捕获ping返回的退出代码时,我总是接收退出代码为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
无论1.1.1.1是否被ping或1.1.1.11是否被ping,行总是给出2,0作为输出 在终端1.1.1.1上是pingable而1.1.1.11不是(我通过在keypress事件上设置的dBool标志切换bw ips以模拟在线/离线主机,以便我的应用程序可以相应地运行)
任何输入都会有很大的帮助..
感谢。
答案 0 :(得分:6)
我认为依赖ping.exe退出代码是一种不好的做法,因为它没有文档记录。此外,众所周知,在不同版本的Windows中,退出代码是不一致的。
你可以:
编辑:
没有意识到你正在使用Linux(下次在你的问题中提及它可能更明智)...
在向ping发送参数时尝试此操作:
params << "1.1.1.11" << "-i" << "1" << "-w" << "1" <<"-c" <<"1";
而不是一个大字符串。
答案 1 :(得分:1)
这样做并不是一个很好的跨平台方式。但您可以使用特定于平台的方式。您可以使用以下命令在Windows和Linux上ping:
#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
}
答案 2 :(得分:0)
您可以使用ping-&gt; execute(return int)而不是ping-&gt; start。 它对我有用!!!
Vladiyork