如何使用 QProcess 通过 Ping 检测“网络不可达”?

Posted

技术标签:

【中文标题】如何使用 QProcess 通过 Ping 检测“网络不可达”?【英文标题】:How to Detect "Network is Unreachable" via Ping using QProcess? 【发布时间】:2012-12-06 07:08:45 【问题描述】:

我在使用 QProcess ping 到目标/本地 IP 时遇到问题。当 ping 成功时,QProcess 返回“0”,而当 ping 给出“网络无法访问”错误时(在终端上手动查看)。

实际上我需要检查我的应用程序中的网络连接。为了实现它,我使用了一个非常简单的使用 QProcess 的 ping 概念。如果有任何网络错误,我需要弹出一个消息框,否则应用程序正常启动而没有任何弹出消息。

这是我的 ping 代码:

   bool App::pingPcuStatus(void)
   
     const QString IP ="192.168.49.44";
     bool ret = false;
     int status;

     if ( IP == "0.0.0.0") 
        status = 1;
     
    else 
            QProcess pingProcess;
            QString exec = "ping";
            QStringList params;
            params << "-c" << "1" << IP;
            status = pingProcess.execute(exec, params); //status = 0 , if Ping Successfull
            pingProcess.close();
     

    ret = (status) ? false : true;
    return ret;
    

但在调试时我发现,即使我没有连接到网络,它也会返回“true”。 (我尝试在终端上使用相同的命令手动 ping,它给出“网络无法访问”错误)。

这在我的情况下导致了一个大错误。

使用 QProcess 或任何其他解决方法来捕获此错误的最佳方法是什么???

欢迎任何想法或建议。

【问题讨论】:

我建议只使用套接字 execute 是一个静态方法。我不明白你为什么要使用一个对象。网络不可达时 Ping 不返回0... @UmNyobe 谢谢!!!我没有注意到静态方法。实际上,我还没有开始使用 Qt。虽然我仍在调试我的代码。也许这可能是我的错误。因为 Ping 不应该返回“0”。 如果成功返回0,失败返回什么?用那个.... 【参考方案1】:

https://***.com/a/2148360/793796的原回答:

QProcess pingProcess;
QString exec = "ping";
QStringList params;
params << "-c" << "1" << IP;
pingProcess.start(exec,params,QIODevice::ReadOnly);
pingProcess.waitForFinished(-1);

QString p_stdout = pingProcess.readAllStandardOutput();
QString p_stderr = pingProcess.readAllStandardError();

然后就可以解析stdout & stderr了。

【讨论】:

感谢您的回答。好吧,我不知道为什么 p_stdout 和 p_stderr 每次都给出空字符串。 现在,您可以从命令行中删除 -c 1 并查看 ping 命令是否使用正确的参数运行?检查 ps 以获取您的 qt 进程,然后检查其子进程 pid。然后检查/proc/$childPid/cmdline 以验证正在执行的命令是否正确。也尝试添加开放模式(见编辑)。

以上是关于如何使用 QProcess 通过 Ping 检测“网络不可达”?的主要内容,如果未能解决你的问题,请参考以下文章

QProcess CLI 命令 - 指定输出保存位置时出现“错误参数”

QProcess精加工的可靠检测

仅当 QProcess Stdout 包含子字符串时才打印它

如何在 Windows 上通过 QProcess 启动提升的子进程?

QProcess 不发出完成信号

Qt笔记-QProcess切换用户执行进程(Linux)