首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Qprocess运行ping,如果主机可达或不可达,则退出代码始终为2

问使用Qprocess运行ping,如果主机可达或不可达,则退出代码始终为2
EN

Stack Overflow用户
提问于 2009-06-27 08:43:27
回答 3查看 5.1K关注 0票数 3

我正在使用Qprocess执行ping来检查主机是否在线...

问题是,无论我ping的是可达主机还是不可达主机,我从Qprocess->finished信号收到的退出代码总是2。

我不断地在QTimer中连接到一个主机(我已经在运行Qt应用的客户端安装了这个文件夹)……

当我在连接到QProcess->finished信号的插槽中捕获到ping返回的退出代码时。我总是收到退出代码为2..

我不能使用直接系统调用通过系统( ping ),因为它挂起我的应用程序时,ping是活动的…我希望它是异步的,所以我切换到QProcess...

以下是代码片段:

代码语言:javascript
复制
//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";
    }
}   

这个

代码语言:javascript
复制
cout<<"\n\nexitCode,exitStatus=="<<exitCode<<","<<exitStatus

无论是line 1.1.1.1还是line 1.1.1.11,line总是给出2,0作为输出。1.1.1.1可line,1.1.1.11不可line(我通过在按键事件上设置的dBool标志切换bw ips,以模拟在线/离线主机,以便我的应用程序可以相应地运行)

任何输入都会有很大的帮助。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-27 08:57:55

我认为依赖ping.exe退出代码是一种糟糕的做法,因为它没有文档记录。此外,众所周知,在不同版本的Windows中,退出代码是不一致的。

您可以:

  • 实现您自己的ping。有很多免费的实现,比如this (在谷歌中搜索"ping.c“时是第一个)。
  • 解析ping.exe输出,并确定ping是否成功。

编辑:

我不知道你正在使用Linux (下一次在你的问题中提到它可能更明智)…

在将参数发送到ping时尝试执行以下操作:

代码语言:javascript
复制
params << "1.1.1.11" << "-i" << "1" << "-w" << "1" <<"-c" <<"1";

而不是一根大绳子。

票数 6
EN

Stack Overflow用户

发布于 2014-06-14 14:38:54

没有一种很好的跨平台方法可以做到这一点。但是您可以使用特定于平台的方式。您可以使用以下命令在Windows和Linux上执行ping操作:

代码语言:javascript
复制
#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
}
票数 1
EN

Stack Overflow用户

发布于 2009-12-23 05:16:59

您可以使用ping->execute (返回int)代替ping->start。这对我很有效!

符拉迪约克

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1052411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档