3

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

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

我不断在 QTimer 中对主机进行 ping 操作(我已将其一个文件夹安装在运行 Qt 应用程序的客户端)...

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

我不能通过 system(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 在终端 1.1.1.1 是可 ping 且 1.1.1.11 不是 1.1.1.11 不是 1.1.1.1 被 ping 到模拟在线/离线主机,以便我的应用程序可以相应地运行)

任何输入都会有很大帮助..

谢谢。

4

3 回答 3

6

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

你可以:

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

编辑:

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

将参数发送到 ping 时试试这个:

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

而不是一根大绳子。

于 2009-06-27T08:57:54.893 回答
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
}
于 2014-06-14T06:38:54.083 回答
0

您可以使用 ping->execute (return int) 代替 ping->start。这个对我有用 !!!

弗拉迪约克

于 2009-12-22T21:16:58.537 回答