设备莫名奇妙的掉线过,但不知道是不是本身网络不稳定引起的,所以借鉴了网络上的一个小函数加工下来放设备里后台运行,判断设备掉线时间和此小东西判断的是否一致,如果是就说明是网络抖动原因,因为设备和服务器心跳为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.改进程序。
*/