网络状态测试程序(基于ping命令)
需求分析
- 在linux下实现一个获取两台设备网络连通性的程序
- 执行速度尽可能的快
概要设计
- 网络连通性测试
- 网络丢包率测试
详细设计
- 网络连通性
为了减少不必要的时间浪费,在测试网络丢包率前进行连通性测试。测试方法就是先使用ping命令ping少量的包数,如果全部失败,则认为网络不通。 - 网络丢包率测试
使用ping命令进行较大包数的测试,统计丢包率。
代码
- 核心思路
在程序中使用system()函数调用ping命令,返回0代表网络测试成功,非0测试失败。其中-c指定ping包次数,这里为1。
#incldue <stdlib.h>
status=system("ping -c 1 xxx.xxx.xxx.xxx");
- 编程实现
#include <stdio.h>
#include <stdlib.h>
#define MAX_TEST 1000
#define MAX_ASK 10
#define MAX_CMD_LEN 50
int network_ping(char *ip)
{
int status;
char cmd[MAX_CMD_LEN];
sprintf(cmd,"ping -c 1 %s > /dev/null",ip);
status=system(cmd);
if(status==0) return 1;
return 0;
}
int network_is_reachable(char *ip)
{
int status;
char cmd[MAX_CMD_LEN];
sprintf(cmd,"ping -c 1 %s > /dev/null",ip);
int i;
for(i=0;i<MAX_ASK;i++)
{
status=system(cmd);
if(status==0) break;
}
if(i>=MAX_ASK)
{
return 0;
}
return 1;
}
double network_loss_rate(char *ip)
{
if(!network_is_reachable(ip)) return 1.00;
int lost=0;
int reached=0;
int i;
for(i=0;i<MAX_TEST;i++)
{
if(network_ping(ip)) reached++;
else lost++;
}
double result=lost*1.0/MAX_TEST;
return result;
}
int main()
{
char ip[]="192.168.1.8";
double loss_rate=network_loss_rate(ip);
printf("丢包率%.2f%%\n",loss_rate*100);
return 0;
}