⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ping2db.c

📁 使用ping命令自动记录主机、路由器的网络连接
💻 C
字号:
/*  

   初建日期: 2001-6-10
   作    者: 邹建国
   Email:    z_j_g@sohu.com   zou_jg@sina.com

   程序功能:    此程序用于解析 ping 命令产生的数据,生成一个格式化的表格形式
                的纯文本文件(.PAR) 和一个用于EXCEL和FOXPRO 导入数据的格式文件(.PDB)
   编译环境:  Borland C/C++ 3.1  DOS  Windows 98
              BCC PING2DB.C 
*/


#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#define LEFT 0
#define RIGHT 1

int makefname(char *name,char *fname,char *ext);
int GetStr(char *line,char *startstr,char *endstr,char *retstr);
int Parse(char *line,char *result);
void trip(char *str);
int FindStr(char *line,char *str);
int IsEmptyLine(char *line);
int StrStyle(char *str,int len,int style);
int GetStrAddMark(char *line,char *startstr,char *endstr,char *retstr);
FILE *fp_in;

/////////////////////////////////////
int main(int _argc,char *_argv[])
/////////////////////////////////////
{
	FILE *fp_out;
	FILE *fp_out2;
	char line[255];
	char fname[255];
	char result[255];
	if (_argc < 2) {
		printf("Usage: Ping2db [FileName]\n");
		exit(0);
	}

	if(access(_argv[1],0)!=0){
		printf("File %s doesn't exist!\n",_argv[1]);
		exit(1);
	}
	fp_in=fopen(_argv[1],"rt");
	if(!fp_in){
		printf("Error to open file: %s!\n",_argv[1]);
		exit(1);
	}
	makefname(_argv[1],fname,"PAR");
	fp_out=fopen(fname,"wt");
	if(!fp_out){
		printf("Error to creat file: %s!\n",fname);
		exit(2);
	}
	printf("Parse to %s !\n",fname);

	makefname(_argv[1],fname,"PDB");
	fp_out2=fopen(fname,"wt");
	if(!fp_out2){
		printf("Error to creat file: %s!\n",fname);
		exit(3);
	}
	printf("%s can be imported by FoxPro or Excel!\n",fname);

	fputs("   Start time    IP address       Send  Rece  Lost  Lost%  Min     Max    Ave   End\n",fp_out);
	fputs("========================================================================================\n",fp_out);
/*
	sprintf(result,"12345");
	StrStyle(result,10,RIGHT);
	puts(result);
	return 0;
*/
	while(!feof(fp_in)){
		fgets(line,254,fp_in);
		if(feof(fp_in))break;
		if(line[0]=='P'&& line[1]=='e')continue;
		Parse(line,result);
//		if(getch()==27)break;
		fwrite(result,1,strlen(result),fp_out);
	}
	fseek(fp_in,0,0);
	while(!feof(fp_in)){
		fgets(line,254,fp_in);
		if(feof(fp_in))break;
		if(line[0]=='P'&& line[1]=='e')continue;
		Parse2(line,result);
		fwrite(result,1,strlen(result),fp_out2);
	}
	fclose(fp_in);
	fclose(fp_out);
	fclose(fp_out2);
	return 0;
}


///////////////////////////////////////////////////////////////////
void trip(char *str)
//将会车符变成空格
///////////////////////////////////////////////////////////////////
{
	int i,slen;
	slen=strlen(str);
	for(i=0;i<slen;i++){
		if(str[i]==0xa)str[i]=0x20;
//			printf("%c-%02x ",str[i],str[i]);
	}
}

///////////////////////////////////////////////////////////////////
int makefname(char *name,char *fname,char *ext)
// 将name字符串去掉.后的字符加入ext指定的扩展名放入fname中
///////////////////////////////////////////////////////////////////
{
	int i,len;
	char *dot;
	len=strlen(name);
	strcpy(fname,name);

	dot=memchr(fname,'.',len);
	if(dot){
		*(dot+1)=ext[0];
		*(dot+2)=ext[1];
		*(dot+3)=ext[2];
		*(dot+4)=0;
		return 1;
	}
	strcat(fname,".");
	strcat(fname,ext);
	return 1;
}
///////////////////////////////////////////////////////////////////
int Parse(char *line,char *result)
//解析ping产生的数据文件,产生表格形式的文本文件
///////////////////////////////////////////////////////////////////
{
	int len,slen;
	char tmp[255];
	slen=strlen(line);
	if(len==0)return 0;
	if(IsEmptyLine(line)){
		printf("%s  is empty!\n",line);
		return 0;
	}
	len=GetStr(line,"\0" , "/2001",result);
//	printf("len=%d %s \n",len,result);
	if(len){
		fgets(line,254,fp_in);
		strcat(result,line);
		len=strlen(result);
		result[len-1]=' ';
		result[len]=0;
		return 1;
	}
//	printf("len=%d %s \n",len,result);
	if(len){
		StrStyle(result,16,LEFT);
		return 1;
	}
	len=GetStr(line,"Pinging" , "with",result);
//	printf("len=%d %s \n",len,result);
	if(len){
		StrStyle(result,16,LEFT);
		return 1;
	}
	len=GetStr(line,"Sent = " , ", R",tmp);
	if(len){
		StrStyle(tmp,6,RIGHT);
		strcat(result,tmp);
		len=GetStr(line,"Received = ", ", L",tmp);
		if(len){
			StrStyle(tmp,6,RIGHT);
			strcat(result,tmp);
		}
		len=GetStr(line,"Lost = " , "(",tmp);
		if(len){
			StrStyle(tmp,6,RIGHT);
			strcat(result,tmp);
		}
		len=GetStr(line,"(","loss",tmp);
		if(len){
			StrStyle(tmp,6,RIGHT);
			strcat(result,tmp);
		}
		return 1;
	}
	len=GetStr(line,"Minimum = ",", Ma",tmp);
	if(len){
		if(len){
			StrStyle(tmp,8,RIGHT);
			strcat(result,tmp);
		}
		len=GetStr(line,"Maximum = ", ", Av",tmp);
		if(len){
			StrStyle(tmp,8,RIGHT);
			strcat(result,tmp);
		}
		len=GetStr(line,"Average = " , "\n",tmp);
		if(len){
			strcat(result,tmp);
			len=strlen(result);
			result[len-1]=' ';
			result[len]=0;
		}
		return 1;
	}
	if(slen<9 && slen>4){
//		printf("%s =%d\n",line,len);
		strcpy(result,line);
		StrStyle(result,8,RIGHT);
		result[9]=0;
		return 1;
	}



	return 0;
}

///////////////////////////////////////////////////////////////////
int Parse2(char *line,char *result)
//解析ping产生的数据文件并在各字段间加入逗号,用于excel和foxpro等软件导入数据
///////////////////////////////////////////////////////////////////
{
	int len,slen;
	char tmp[255];
	slen=strlen(line);
	if(len==0)return 0;
	if(IsEmptyLine(line)){
		printf("%s  is empty!\n",line);
		return 0;
	}
	len=GetStrAddMark(line,"\0" , "/2001",result);
	if(len){
			fgets(line,254,fp_in);
			strcat(result,line);
			len=strlen(result);
			result[len-1]=',';
			result[len]=0;
		return 1;
	}
	len=GetStrAddMark(line,"Pinging" , "with",result);
	if(len){
		return 1;
	}
	len=GetStrAddMark(line,"Sent = " , ", R",tmp);
	if(len){
		strcat(result,tmp);
		len=GetStrAddMark(line,"Received = ", ", L",tmp);
		if(len){
			strcat(result,tmp);
		}
		len=GetStrAddMark(line,"Lost = " , "(",tmp);
		if(len){
			strcat(result,tmp);
		}
		len=GetStrAddMark(line,"(","% loss",tmp);
		if(len){
			strcat(result,tmp);
		}
		return 1;
	}
	len=GetStrAddMark(line,"Minimum = ","ms, Ma",tmp);
	if(len){
		if(len){
			strcat(result,tmp);
		}
		len=GetStrAddMark(line,"Maximum = ", "ms, Av",tmp);
		if(len){
			strcat(result,tmp);
		}
		len=GetStrAddMark(line,"Average = " , "ms\n",tmp);
		if(len){
			strcat(result,tmp);
		}
		return 1;
	}
	if(slen<9 && slen>4){
		strcpy(result,line);
//		len=strlen(result);
//		result[len]=',';
//		result[len]=0;
		return 1;
	}

	return 0;

}

///////////////////////////////////////////////////////////////////
int IsEmptyLine(char *line)
//是否空行
///////////////////////////////////////////////////////////////////
{
  while(*line){
	line++;
	if( !isspace(*line)){return 0;}
  }
  return 1;
}
///////////////////////////////////////////////////////////////////
int GetStrAddMark(char *line,char *startstr,char *endstr,char *retstr)
//得到指定两个字符串之间的字符串后增加一个逗号
///////////////////////////////////////////////////////////////////
{	int len;
	len=GetStr(line,startstr,endstr,retstr);
	if(len){
		len=strlen(retstr);
		retstr[len]=',';
		retstr[len+1]=0;
		return len+1;
	}
	return 0;
}
///////////////////////////////////////////////////////////////////
int GetStr(char *line,char *startstr,char *endstr,char *retstr)
//得到指定两个字符串之间的字符串
///////////////////////////////////////////////////////////////////
{
	int len,slen,s,e,s2;
	len=strlen(line);
	slen=strlen(startstr);
	s=FindStr(line,startstr)+slen;
	if(startstr[0]=='\0')s=0;
	e=FindStr(line,endstr);
//	printf("%s   %s=%d %s=%d\n",line,startstr,s,endstr,e);
	if(s>-1 && e>-1){
		memcpy(retstr,line+s,e-s);
		retstr[e-s]=0;
//		printf("GetStr %s=%d %s=%d\n ret=%s\n",startstr,s,endstr,e,retstr);
		return e-s;
	}
	*retstr=0;
	return 0;
}
/////////////////////////////////////////
int FindStr(char *line,char *str)
//在字符串line中查找字符串str,并返回首位置
/////////////////////////////////////////
{
	int i,len=0,lenstr;
//	printf("%s\n%s",line,str);
	lenstr=strlen(str);
	len=strlen(line);
	if(str[0]=='\n')return len;
	for(i=0;i<len;i++){
		if(line[i]==str[0]){
			if(lenstr==1)return i;
			if(strncmp(str+1,line+i+1,lenstr-1)==0){
//				printf("find %s in %s =%d\n",str,line,i);
				return i;
			}
		}
//		else putchar(line[i]);
	}
	return -1;
}
/////////////////////////////////////////
int StrStyle(char *str,int len,int style)
// 将字符串str按style设定的风格进行左、右对齐,不够长度len的补空格
/////////////////////////////////////////
{
	int i,slen,addlen;
	slen=strlen(str);
	addlen=len-slen;
//	printf("addlen=%d style=%d\n",addlen,style);
	if(addlen>0){
		if(style==LEFT){
		   for(i=slen;i<len;i++){
			  str[i]=' ';
		   }
		   str[i]=0;
		}
		if(style==RIGHT){
		   for(i=slen;i>=0;i--)
			  str[i+addlen]=str[i];
		   for(i=0;i<addlen;i++)
			   str[i]=' ';
		   str[len]=0;
//		puts(retstr);
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -