主要问题: 可以ping 但无法获取RTT
几种Ping是否在线的方法 参考大佬: QT实现ping功能
在C#中 有自带的Ping类
可以通过发送主机名或IP地址 获取到ICMP状态和回复时间RoundtripTime(RTT)
但在Qt中 没有封装好的Ping类和相关方法(也可能是我没有发现 不会用)
通过QProcess可以调用cmd下发ping命令 再解析命令回复"时间=" 但反复调用cmd再解析 容易引发一些故障 且不能跨平台 不够优雅
通过上边链接里大佬的第三种方法 建立socket连接 可以判断是否连通 但无法获取到RTT
解决办法: 限制socket的超时时间 获取RTT
先简单用文字描述一下思路:
用定时器 从1ms(或者某个比较小的时间)开始计时
timerTick中 通过QTcpSocketd waitForConnected(msec)方法 一次次增大定时器的时间
直到ping通为止 就能得到当前的RTT
以Ping百度为例
主要代码如下
//首先是定时器的计时时间 也是Socket等待连接的超时时间 我这里从10ms开始了
int timeout = 10;
//定时器
QTimer *tcpTimer;
tcpTimer = new QTimer(this);
connect(tcpTimer,&QTimer::timeout,this,timerTick);
tcpTimer->setSingleShot(true); //不设定成单次计时也行 记得自己