当前位置:   article > 正文

Qt实现ping命令检测主机是否在线_qt ping

qt ping

最近遇到这个需求,但是发现一个问题,主机可以使用TCP连接但是使用HTTP连接超时(ping超时),于是需要用QT实现ping命令。

网上看了一下,发现竟然没有实现!于是只能自己实现了!

首先需要说明的是,我肯定不希望用QProcess执行"ping.exe”实现,不能跨平台不说,也不优雅。

在网上看到某段TCP代码,给了我很大的启发,原帖在这里,这段代码思路不错,可惜不符合我的要求!

因为我发现实测某些主机可以使用TCP连接但是使用HTTP连接超时(ping超时)。

  1. //判断IP地址及端口是否在线
  2. static bool IPLive(QString ip, int port, int timeout = 1000) {
  3. QTcpSocket tcpClient;
  4. tcpClient.abort();
  5. tcpClient.connectToHost(ip, port);
  6. //100毫秒没有连接上则判断不在线
  7. return tcpClient.waitForConnected(timeout);
  8. }
  9. //判断是否通外网
  10. static bool IsWebOk() {
  11. //能接通百度IP说明可以通外网
  12. return IPLive("115.239.211.112", 80);
  13. }

于是我把上述代码修改为http请求,中间走了不少弯路,不断测试调整,这里直接把最终的代码分享出来吧。

  1. //author:autumoon
  2. //联系QQ:4589968
  3. //日期:2020-12-03
  4. //判断主机是否在线
  5. static bool IsHostOnline(QString strHostName, int nTimeoutmSeconds = 2000);
  6. //判断是否通外网,能连接百度IP说明可以通外网
  7. static bool IsWebOk(){return IsHostOnline("202.108.22.5", 2000);}

实现:

  1. //author:autumoon
  2. //联系QQ:4589968
  3. //日期:2020-12-03
  4. bool HttpDownload::IsHostOnline(QString strHostName, int nTimeoutmSeconds)
  5. {
  6. QNetworkRequest request(strHostName);
  7. request.setRawHeader("Content-Type", "charset='utf-8'");
  8. request.setRawHeader("Content-Type", "application/json");
  9. QNetworkAccessManager* naManager = new QNetworkAccessManager;
  10. QEventLoop eventloop;
  11. QTimer timer;
  12. timer.singleShot(nTimeoutmSeconds, &eventloop, SLOT(quit()));
  13. timer.start();
  14. QNetworkReply* reply = naManager->get(request);
  15. QMetaObject::Connection conRet = QObject::connect(reply, SIGNAL(finished()), &eventloop, SLOT(quit()));
  16. Q_ASSERT(conRet);
  17. eventloop.exec(QEventLoop::ExcludeUserInputEvents);
  18. if (!timer.isActive())
  19. {
  20. //超时,未知状态
  21. disconnect(reply, SIGNAL(finished()), &eventloop, SLOT(quit()));
  22. reply->abort();
  23. reply->deleteLater();
  24. return false;
  25. }
  26. if (reply->error() != QNetworkReply::NoError)
  27. {
  28. reply->abort();
  29. reply->deleteLater();
  30. return false;
  31. }
  32. bool bRes = reply->readAll().length() > 0;
  33. reply->abort();
  34. reply->deleteLater();
  35. return bRes;
  36. }

 成功解决问题!使用了定时器解处理超时的问题!执行本函数相当于执行ping,而且跨平台!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/42478
推荐阅读
相关标签
  

闽ICP备14008679号