10

目前,我使用此代码检索目标系统的 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
4

4 回答 4

15

您可以使用以下命令在 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
   }
于 2014-04-08T12:29:58.127 回答
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
}

现已测试和工作。

于 2016-06-28T22:21:01.090 回答
3

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

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

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

您可以在此处阅读更详尽的说明。

于 2014-04-08T19:42:15.737 回答
1

如果目标在 Windows 中无法访问,ping 方法将返回 0 退出代码事件。您必须解析命令输出。以下示例适用于 Windows 和 linux :

class MyClass {
  private slots:
   void OnPing();
   void OnPingEnded();
  private:
   Process mPingProcess;
};

void MyClass::OnPing()
{
   connect(&mPingProcess, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(OnPingEnded()));
#ifdef __linux__
   mPingProcess.start("ping", QStringList() << "-c" << "1" << ui->ip->text());
#else
   mPingProcess.start("ping", QStringList() << "-n" << "1" << ui->ip->text());
#endif
}

void MyClass::OnPingEnded()
{
    QByteArray output = mPingProcess.readAllStandardOutput();
    if (!output.isEmpty())
    {
        qDebug() << output;
        if (-1 != QString(output).indexOf("ttl", 0, Qt::CaseInsensitive))
        {
           qDebug() << "PING OK";
        }
        else
        {
           qDebug() << "PING KO";
        }
    }
}
于 2018-04-06T12:35:41.803 回答