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 に答える