linux获取网络延时的平均时长
函数实现了获取网络延时的平均时长,函数返回值非0时为异常状态,返回值为0时,net_delay为延时时长。
PING
通常ping命令返回的结果中最后一行形如:
rtt min/avg/max/mdev = 0.103/0.162/0.268/0.056 ms
ping参数
-c count请求次数
-W timeout 等待每个回复的超时时间,单位是s
tail参数
-n <行数> 输出文件最后指定行数
awk参数
-F fs 设置输入字段分隔符为fs
话不多说,直接上代码
int get_network_delay(const char *ip,double& net_delay)
{
std::string cmd;
cmd += "ping -c 2 -W 1 ";
cmd += ip;
cmd += " | tail -n 1 | awk -F' ' '{split($4,a,\"/\"); print a[2]}'"; // 其中“前的\为转义字符
printf("cmd:%s\n",cmd.c_str());
auto fp = popen(cmd.c_str(),"r"); //FILE *fp;
if(nullptr == fp)
{
return -1;
}
//获取ping的返回
double delay_d;
char delay_cs[512];
string delay_s;
while(!feof(fp))
{
memset(delay_cs,0,sizeof(delay_s));
if(nullptr != fgets(delay_cs,512,fp))
{
printf("delay string:%s\n",delay_cs);
delay_s = delay_cs;
}
}
if(delay_s.empty())
{
pclose(fp);
return -2;
}
try{
delay_d = std::stod(delay_s);
}
catch (const std::invalid_argument& e){
printf("Invalid ping result\n");
pclose(fp);
return -3;
}
catch (const std::out_of_range& e){
pclose(fp);
return -4;
}
net_delay_ = delay_d;
pclose(fp);
return 0;
}