目前,我使用此代码检索目标系统的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
答案 0 :(得分:12)
您可以使用以下命令在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
}
答案 1 :(得分:7)
Nejat的代码对我来说既不适合我。也许它是特定于Windows的(在Windows 7 x64 + Qt 5.6上测试过)。 Ping命令似乎是不同的参数和值,需要在创建QProcess时将它们分开。
所以不要传递&#34; -n 1&#34;一次性,你需要通过&#34; -n&#34;和&#34; 1&#34;分开。
基本上,根据Nejat的代码,它将是:
int exitCode = QProcess::execute("ping", QStringList()
<< "-n" << "1"
<< m_sHostName);
if (exitCode==0) {
// it's alive
} else {
// it's dead
}
现在经过测试和工作。
答案 2 :(得分:2)
如果没有QAbstractSocket
,您需要为此编写代码。简而言之,这个基类不是为这个用例而设计的。
原因是您需要使用原始套接字并以root身份运行;这也是为什么你经常看到Linux上的ping可执行文件上设置setuid标志的原因。
ICMP是&#34;无连接&#34;,因此Qt类不可行,因为它不提供向特定主机发送数据等。
您可以阅读更全面的解释in here。
答案 3 :(得分: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";
}
}
}