长时间判断网络连接情况(小工具)

设备莫名奇妙的掉线过,但不知道是不是本身网络不稳定引起的,所以借鉴了网络上的一个小函数加工下来放设备里后台运行,判断设备掉线时间和此小东西判断的是否一致,如果是就说明是网络抖动原因,因为设备和服务器心跳为60s,所以我设置了50s。

#include <stdio.h>
#include <unistd.h>
#include <string.h> 
#include <stdlib.h>
#include <time.h>

#define PING_TEST_IPV6_OK "OK\n"
#define PING_TEST_IPV6_FAIL "NO\n"


char *getstimeval(char *buf)  
{   
        struct timeval tv;  
        struct tm      tm;  
        size_t         len = 28;  
        gettimeofday(&tv, NULL);  
        localtime_r(&tv.tv_sec, &tm);  
        strftime(buf, len, "%Y-%M-%D %H:%M:%S", &tm);  
        len = strlen(buf);  
        sprintf(buf + len, ".%6.6d", (int)(tv.tv_usec));  
        //printf("get time:%s\n",buf);
        return buf;  
}  

char *ping_check (char *gateway_str)
{
    FILE *fp;
    size_t len = 0;
    char *pos;
    int percent = 100;
    char* line = NULL;  
    char cmd[80]={0};
    char *ret=NULL;
    sprintf(cmd, "ping -c 1 -q %s >ping_gatway.txt",gateway_str);
    system(cmd);
    /*ping [-c 发送次数][-i 间隔秒数][-I(大写i)网络界面][-l(小写L)前置载入][-p范本样式][-s数据包大小][-t存活数值][主机名或IP地址]*/
    fp = fopen("ping_gatway.txt", "r");
    if (!fp){
    ret = "open txt fail";
        goto error1;
    }else{
    }
  while (getline (&line, &len, fp) != -1)   {
    if (strncmp ("packets transmitted", line + 2, 19) != 0){
            continue;
         }
        pos = strchr (line, '%');
        if (pos == 0) {
        ret = "failed";
            goto error1;
        }
        while (*pos != ' ')
            {   
              pos--;
            }
        sscanf (pos, " %d%% loss", &percent);
        if (percent == 0){
            //printf("ping_check:OK\n");
            fclose(fp);
            return PING_TEST_IPV6_OK;

        }else {
            fclose(fp);
           // printf("ping_check:unknow address\n");
            }
       return PING_TEST_IPV6_FAIL;
       }

    error1:
     fclose(fp);
     return ret;
}

FILE *open_file(void){
    int ret;
    FILE *file_describe;
    file_describe = fopen("logs.txt","a+");
    if(!file_describe){
        //printf("open logs.txt failed\n");
        return 0;
    }else{
        //printf("open logs.txt sucessful\n");
        return file_describe;
    }
    return 0;
}

int write_file(char *content,FILE *fp){
    int str_len = fwrite(content,sizeof(char),strlen(content),fp);
    fflush(fp);
    return str_len;
}

int opreate_file(char *Connect_ret,FILE *fp){
    char now_time[100];
    char write_file_str[200];
    if(Connect_ret == NULL){
        Connect_ret = "cannot reached\n";
    }
    memset(now_time,0,sizeof(now_time));
    memset(write_file_str,0,sizeof(write_file_str));
    getstimeval(now_time);
    memcpy(write_file_str,now_time,strlen(now_time));
    strcat(write_file_str,"--->");
    strcat(write_file_str,Connect_ret);
    int tem_len = write_file(write_file_str,fp);
    memset(write_file_str,0,sizeof(write_file_str));
    fclose(fp);
}

int main (void){
    char *result;
    FILE *fp;
    fp = open_file();
    while(1){
        sleep(50);
        result = ping_check("www.baidu.com");
        if(result == "NO\n"){
            int i;
            for(i=0;i<3;i++){
                result = ping_check("www.baidu.com");
                if(result == "OK\n"){
                    break;
                }
            }           
        }
        opreate_file(result,fp);
        }
}

/*运行一段时间发现报错:sh: error while loading shared libraries: libc.so.6: cannot open shared object file: Error 24
sh:open too many files
1.首先查看linux设置打开文件上限:ulimit -n 系统默认为1024
2.查看本机打开了多少文件:lsof -n|awk ‘{print $2}’|sort|uniq -c|sort -nr|more
结果为:1024 /home/user/connect //这个为我的应用
23 /bin/busybox
8 /sbin/udevd
3.改进程序。
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值