首页 文章

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

提问于
浏览
3

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

问题是,无论是ping可达主机还是无法访问的主机,我从Qprocess->完成信号中接收的退出代码总是2 .

我一直在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到终端1.1.1.1是pingable而1.1.1.11不是(i切换bw ips通过在keypress事件上设置的dBool标志,则总是给出2.0作为输出模拟在线/离线主机,以便我的应用程序可以相应地运行)

任何输入都将是一个很大的帮助..

谢谢 .

3 回答

  • 0

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

    你可以:

    • 实现自己的ping . 有很多免费的实现,如this(在谷歌搜索"ping.c"时的第一个) .

    • 解析ping.exe输出并确定ping是否成功 .

    编辑:

    没有意识到你正在使用Linux(下次在你的问题中提及它可能更明智)...

    将参数发送到ping时尝试此操作:

    params << "1.1.1.11" << "-i" << "1" << "-w" << "1" <<"-c" <<"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
    }
    
  • 6

    您可以使用ping-> execute(return int)而不是ping-> start . 这个对我有用 !!!

    Vladiyork

相关问题