【C++】基础:获取ping的时延数据示例

😏1. ping介绍

PING是一种常用的网络工具,用于测试计算机之间的连接状况和测量网络时延。它发送一个小的数据包到目标计算机,并等待接收响应。通过测量从发送到接收的时间差,可以得出网络延迟或往返时间(Round-Trip Time, RTT),即从发送请求到获取响应的时间。

PING测试主要用途如下:

  1. 连通性测试:PING用于测试计算机与目标主机之间是否可以互相进行通信。它能够快速检查网络连接是否正常,以及是否存在丢包、延迟或其他网络问题。
  2. 网络性能评估:通过测量PING的往返时间,可以评估网络的性能和响应速度。根据PING的结果,可以确定网络连接的稳定性和吞吐量。
  3. 故障排除:当发生网络故障时,PING可以帮助识别问题所在。如果PING测试失败,可能表明目标主机不可达或相关网络设备存在故障。
  4. 监控网络质量:通过定期执行PING测试,并记录RTT值的变化情况,可以监控网络质量的稳定性和变化趋势,帮助网络管理员及时发现和解决潜在的问题。

PING的结果通常包括以下关键信息:

  1. 目标主机的IP地址或域名。
  2. 发送数据包的字节数和TTL(Time To Live)值。
  3. 往返时间(RTT):表示从发送PING请求到接收响应的时间。通常以毫秒为单位。
  4. 丢包率:表示在PING过程中丢失的数据包的百分比。
代码语言:javascript
复制
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=49 time=24.9 ms

--- baidu.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 24.859/24.859/24.859/0.000 ms

😊2. C++示例

代码语言:javascript
复制
#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

int getPingTime(const std::string& ip)
{
std::ostringstream commandStream;
commandStream << "ping -c 1 " << ip << " > ping_tmp.txt";
std::system(commandStream.str().c_str());

std::ifstream file(&#34;ping_tmp.txt&#34;);
if (!file.good()) {
    std::cerr &lt;&lt; &#34;Failed to open ping result file&#34; &lt;&lt; std::endl;
    return 0;
}

std::string line;
while (std::getline(file, line)) {
    if (line.find(&#34;time=&#34;) != std::string::npos) {
        int startIndex = line.find(&#34;time=&#34;) + 5;
        int endIndex = line.find(&#34; ms&#34;, startIndex);
        // std::cout &lt;&lt; startIndex &lt;&lt; &#34; &#34; &lt;&lt; endIndex &lt;&lt; std::endl;
        return std::stoi(line.substr(startIndex, endIndex - startIndex));
    }
}

return 0;

}

int main()
{
std::string ipAddress = "baidu.com";

int pingTime = getPingTime(ipAddress);
std::cout &lt;&lt; &#34;Ping time: &#34; &lt;&lt; pingTime &lt;&lt; &#34; ms&#34; &lt;&lt; std::endl;

return 0;

}

😊3. Qt示例

Qt示例:

代码语言:javascript
复制
QString MainWindow::getPingTime()
{
QStringList pingCommand;
pingCommand << "-n" << "1" << "www.baidu.com";

QProcess process;
process.start(&#34;ping&#34;, pingCommand);
process.waitForFinished();

QString output = process.readAllStandardOutput();
QStringList lines = output.split(&#34;\r\n&#34;);

for (QString line : lines) {
    if (line.contains(&#34;时间&#34;)) {
        int start = line.indexOf(&#34;时间=&#34;) + 3;
        int end = line.indexOf(&#34;ms&#34;, start);
        if (end != -1) {
            QString timeStr = line.mid(start, end - start);
            qDebug() &lt;&lt; &#34;Time:&#34; &lt;&lt; timeStr &lt;&lt; &#34;ms&#34;;
        }
    } else if (line.contains(&#34;time=&#34;)) {
        int start = line.indexOf(&#34;time=&#34;) + 5;
        int end = line.indexOf(&#34;ms&#34;, start);
        if (end != -1) {
            QString timeStr = line.mid(start, end - start);
            qDebug() &lt;&lt; &#34;Time:&#34; &lt;&lt; timeStr &lt;&lt; &#34;ms&#34;;
        }
    }
}

}

😆4. python及shell示例

python示例:

代码语言:javascript
复制
import subprocess
from datetime import datetime, timedelta
import time

def ping_host(host):
# 提供subprocess模块执行ping命令
try:
output = subprocess.check_output(["ping", "-c", "1", host])
result = str(output).split("time=")[1].split(" ")[0]
return float(result)
except subprocess.CalledProcessError:
return None

def write_to_log(filename, data):
with open(filename, 'a') as f:
f.write(data + '\n')

def delete_old_logs(filename):
today = datetime.now()
yesterday = today - timedelta(days=1)
formatted_date = yesterday.strftime("%Y-%m-%d")
# 逐行检查日期是否是前一天的
try:
with open(filename, 'r') as f:
lines = f.readlines()
with open(filename, 'w') as f:
for line in lines:
if not line.startswith(formatted_date):
f.write(line)
except FileNotFoundError:
pass

filename = 'ping_logs.txt'
host = 'baidu.com'
interval = 1 # 每隔1秒进行一次ping操作

while True:
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
latency = ping_host(host)
log_entry = f"{current_time} - Ping Latency: {latency} ms"
write_to_log(filename, log_entry)
delete_old_logs(filename)
print(log_entry) # 打印延迟结果到终端
time.sleep(interval)

shell示例:

代码语言:javascript
复制
#!/bin/bash
net_path="./network/"
target_host="baidu.com" # need config

if folder exist

if [ ! -d "$net_path" ]; then
mkdir -p "$net_path"
echo "folder not exist: $net_path"
else
echo "folder exist: $net_path"
fi

get timestamp

get_timestamp() {
date +"%Y-%m-%d %H:%M:%S"
}

autoclean

if [ -d "${net_path}" ]; then
echo start delete log 1 days ago...
find "${net_path}"/* -name '*.txt' -mtime +0 -exec rm -rf {} ;
echo end delete log ...
fi

get ping value

filename_prefix="${net_path}ping"
timestamp=$(get_timestamp)
filename="{filename_prefix}_{timestamp}.txt"

while true; do
ping_result=(ping -c 1 target_host | grep time= | awk -F 'time=' '{print $2}' | cut -d ' ' -f 1)

echo &#34;$timestamp - Ping: $ping_result ms&#34;   # display
echo &#34;$timestamp - Ping: $ping_result ms&#34; &gt;&gt; &#34;$filename&#34;    # log

sleep 1

done