使用Qt从远程目标获取ping(Windows/Linux)

dgr*_*rat 9 c++ qt ping qtnetwork qabstractsocket

目前,我使用此代码检索目标系统的ping.但是它到目前为止只能在linux下工作,它可能依赖于语言环境设置.添加对Windows的支持可能会更复杂.是否有一种简单的方法或库来获取目标系统的ping?我主要使用Qt,所以如果我可以使用QSockets,那将是理想的.

#ifndef _WIN32
QProcess ping;
ping.start("ping", QStringList() << "-c 1" << m_sHostName);
if(ping.waitForFinished(250) ) {
    while(ping.canReadLine()) {
        QString line = ping.readLine();
        if(line.contains("time=")) {
            int iStart = line.indexOf("time=") + 5;
            int iStop = line.indexOf(" ms");
            QStringRef latency(&line, iStart, iStop-iStart);

            m_vNetwork_s.append(time_s);
            m_vLatency_ms.append(QString(latency.toLocal8Bit()).toDouble());
            break;
        }
    }
}
#endif
Run Code Online (Sandbox Code Playgroud)

Nej*_*jat 13

您可以使用以下命令在Windows和Linux上ping:

   QStringList parameters;
#if defined(WIN32)
   parameters << "-n" << "1";
#else
   parameters << "-c 1";
#endif

   parameters << m_sHostName;

   int exitCode = QProcess::execute("ping", parameters);
   if (exitCode==0) {
       // it's alive
   } else {
       // it's dead
   }
Run Code Online (Sandbox Code Playgroud)


小智 8

Nejat的代码对我来说也不适用.也许它是Windows特定的(在Windows 7 x64 + Qt 5.6上测试).Ping命令似乎是不同的参数和值,需要在创建QProcess时将它们分开.

因此,不需要一次性传递"-n 1",而是需要分别传递"-n"和"1".

基本上,使用Nejat的代码将是:

int exitCode = QProcess::execute("ping", QStringList()
                                     << "-n" << "1"
                                     << m_sHostName);
if (exitCode==0) {
    // it's alive
} else {
    // it's dead
}
Run Code Online (Sandbox Code Playgroud)

现在经过测试和工作.


lpa*_*app 3

您需要为此编写代码而无需QAbstractSocket. 简而言之,这个基类不是为这个用例设计的。

原因是您需要使用原始套接字并以 root 身份运行;这也是为什么您通常会在 Linux 上的 ping 可执行文件上看到设置了 setuid 标志的原因。

ICMP 是“无连接”的,因此 Qt 类对其不可行,因为它不提供向特定主机发送数据等。

您可以在这里阅读更详尽的解释。