判断互联网和路由器的连接是否畅通

int check(void)
{
	char buf[512] = {0};
	FILE *fp = NULL;
	int i = 0;
	char gateway_ip[32] = {0};
	char buf1[128] = {0};

	fp = popen("route -n | grep UG |awk '{print $2}'","r"); //执行route 获取网关的ip
	fgets(gateway_ip, 32, fp);
	pclose(fp);

	printf("gateway_ip : %s, len : %d\n",gateway_ip,strlen(gateway_ip));
	if(strlen(gateway_ip) < 7)
	{
		printf("len < 7\n");
		return -1;
	}
	if(gateway_ip[0] == 0)
	{
		printf("gateway_ip[0] == 0\n");
		return -1;
	}
	if(gateway_ip[0] == '\n')
	{
		printf("gateway_ip[0] == n \n");
		return -1;
	}
	if(gateway_ip[0] == '\r')
	{
		printf("gateway_ip[0] == r \n");
		return -1;
	}

	gateway_ip[strlen(gateway_ip) - 1] = 0;//clear \n
	sprintf(buf1, "ping -c 4 -W 5 %s",gateway_ip); //组成ping网关的命令
	for(i = 0; i < 2; i++) //连续尝试2次
	{
		fp = popen("ping -c 4 -W 5 8.8.8.8","r"); //执行ping 谷歌dns服务器的ip,为什么不是ping www.google.com ? 下面会说明
		if(fp)
		{
			memset(buf, 0x0, sizeof(buf));
			fread(buf, 510, 1, fp); 
			pclose(fp);
			fp = NULL;
			if((strstr(buf, "time=") != NULL) && (strstr(buf, "ttl=") != NULL)) //如果命令返回的字符串中包含time=和ttl=就说明ping成功了
			{
				return 0; //返回0表示互联网畅通
			}
		}
		fp = popen(buf1,"r"); //执行ping网关的指令,测试和路由器连接是否畅通
		if(fp)
		{
			memset(buf, 0x0, sizeof(buf));
			fread(buf, 510, 1, fp);
			pclose(fp);
			fp = NULL;
			if((strstr(buf, "time=") != NULL) && (strstr(buf, "ttl=") != NULL))
			{
				return 1; //如果ping网关成功返回1说明路由器只有路由器时通的
			}
		}
	}
	return -1; //连续尝试2次后返回错误表示和路由器之间的连接都不通
}
上面代码中为何不去ping 谷歌的域名而是ping dns服务器的ip呢?这是因为ping域名的过程中首先要解析域名,如果网络不通,
域名解析的过程会卡住一段时间从而不能快速反应,ping ip则可以限定超时时间和尝试次数
ping -c 4 -W 5 指定尝试4次,每次的超时时间是5秒


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值