69,369
社区成员
发帖
与我相关
我的任务
分享
//题目要求是实现下面6个功能,我现在能写出的代码能实现前两个功能,和老师沟通过后,我代码存在的问题应该
//是没能把文件中信息存储在结构体中,我在代码中使用了strncpy_s函数,想把信息复制到结构体items中,但是后面
//的功能实现不了,已经卡在这里好久了,还是没有进步,能看看错在哪了吗?
//(1)对日志文件进行列表读取和写入;
//(2)计算日志文件中GET类型请求方式的占比;
//(3)对访问状态码进行分析与统计,计算所有访问状态码的比率;
//(4)分析访问最多的客户IP地址,并统计其访问次数;
//(5)分析常用密码,并统计密码使用次数;
//(6)用户输入时间段,查找该时间段内访问记录并输出到文件中
#include<stdio.h>
#include<string.h>
struct record //结构体
{
char method[255]; //[GET POST]
char ip[255]; //[233.102.79.50]
char protocol[255];//[HTTP/1.1]
char time[255]; //[2021-01-18 08:57:44]
char add[255]; //[http://39.99.254.200:8810]
char port[255]; //[/admin/login.jsp]
char page[255]; //[passwd=admin123&&password=123456]
char status[255]; //[403]
char exploer_info[255];//[Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko]
};
struct record rec[2048];//文件有2048行
int main(void)
{
char line[1024];
int i=0,n=0,k,j,max,j_pos,j_pos1,pos[9],pos1[9];
FILE *fp;
fp=fopen("access.log","r+");//打开文件
if(!fp){
printf("false\n");
return -1;
}
else{
printf("open file successful!\n");
}
while((fgets(line,1024,fp))!=NULL){
j_pos=0,j_pos1=0;
for(j=0;j<strlen(line);j++){
if(line[j]=='[') {pos[j_pos]=j; j_pos++;} //'[' 位置标记
if(line[j]==']') {pos1[j_pos1]=j;j_pos1++;}//']' 位置标记
}
strncpy(rec[i].method, (line+pos[0]+1),pos1[0]-pos[0]-1);
strncpy(rec[i].ip, (line+pos[1]+1),pos1[1]-pos[1]-1);
strncpy(rec[i].protocol, (line+pos[2]+1),pos1[2]-pos[2]-1);
strncpy(rec[i].time, (line+pos[3]+1),pos1[3]-pos[3]-1);
strncpy(rec[i].add, (line+pos[4]+1),pos1[4]-pos[4]-1);
strncpy(rec[i].page, (line+pos[5]+1),pos1[5]-pos[5]-1);
strncpy(rec[i].port, (line+pos[6]+1),pos1[6]-pos[6]-1);
strncpy(rec[i].status, (line+pos[7]+1),pos1[7]-pos[7]-1);
strncpy(rec[i].exploer_info,(line+pos[8]+1),pos1[8]-pos[8]-1);
i++;
}
fclose(fp);//关闭文件
int *a = new int[i],*b = new int[i];// 统计数组申请
memset(a,0,sizeof(int)*i); //数组初始化
memset(b,0,sizeof(int)*i);
for(j=0;j<i;j++){
if(strcmp(rec[j].method,"GET")==0)n++;//GET请求统计 第二题
for(k=0;k<i;k++){
if(strcmp(rec[j].status,rec[k].status)==0) b[j]++;//状态码进行分析统计 第三题
if(strcmp(rec[j].ip,rec[k].ip)==0) a[j]++; //分析统计访问最多的客户IP地址 第四题
}
}
printf("输出GET请求所占比例:%6.3f\n",1.0*n/i);//输出GET请求所占百分比;
max = a[0];k=0;
for(j=0;j<i;j++){
printf("rec[%d].status=%s:%6.3f\n",j,rec[j].status,b[j]*1.0/i);//输出所有访问状态码的比率
if(max<a[j]) {max = a[j];k=j;} // 找到访问最多的客户IP地址次数 第四题
}
printf("访问最多的客户IP地址:%s,共访问:%d次\n",rec[k].ip,a[k]);//输出访问最多的客户IP地址及次数 第四题
delete [] a; //释放数组
delete [] b;
//下面这段输出看看读入到rec[i]中的内容是否达预期目标,等程序调试完毕,这段可以删除:
//例子开始:
for(j=0;j<i;j++)
{
printf("\n%s %s %s %s %s %s %s %s %s \n",
rec[j].method,rec[j].ip, rec[j].protocol,
rec[j].time, rec[j].add, rec[j].page,
rec[j].port, rec[j].status,rec[j].exploer_info);
}
//例子结束
return 0;
}
//open file successful!
//输出GET请求所占比例: 0.818
//rec[0].status=200: 0.909
//rec[1].status=200: 0.909
//rec[2].status=200: 0.909
//rec[3].status=412: 0.091
//rec[4].status=200: 0.909
//rec[5].status=200: 0.909
//rec[6].status=200: 0.909
//rec[7].status=200: 0.909
//rec[8].status=200: 0.909
//rec[9].status=200: 0.909
//rec[10].status=200: 0.909
//访问最多的客户IP地址:233.102.79.50,共访问:11次
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//POST 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp 412 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//POST 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//请按任意键继续. . .
//题目要求是实现下面6个功能,我现在能写出的代码能实现前两个功能,和老师沟通过后,我代码存在的问题应该
//是没能把文件中信息存储在结构体中,我在代码中使用了strncpy_s函数,想把信息复制到结构体items中,但是后面
//的功能实现不了,已经卡在这里好久了,还是没有进步,能看看错在哪了吗?
//(1)对日志文件进行列表读取和写入;
//(2)计算日志文件中GET类型请求方式的占比;
//(3)对访问状态码进行分析与统计,计算所有访问状态码的比率;
//(4)分析访问最多的客户IP地址,并统计其访问次数;
//(5)分析常用密码,并统计密码使用次数;
//(6)用户输入时间段,查找该时间段内访问记录并输出到文件中
#include<stdio.h>
#include<string.h>
struct record //结构体
{
char method[255]; //[GET POST]
char ip[255]; //[233.102.79.50]
char protocol[255];//[HTTP/1.1]
char time[255]; //[2021-01-18 08:57:44]
char add[255]; //[http://39.99.254.200:8810]
char page[255]; //[/admin/login.jsp]
char port[255]; //[passwd=admin123&&password=123456]
char status[255]; //[403]
char exploer_info[255];//[Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko]
};
struct record rec[2048];//文件有2048行
int main(void)
{
char line[1024];
int i=0,j,j_pos,j_pos1,pos[9],pos1[9];
FILE *fp;
fp=fopen("access.log","r+");//打开文件
if(!fp){
printf("false\n");
return -1;
}
else{
printf("open file successful!\n");
}
while((fgets(line,1024,fp))!=NULL){
j_pos=0,j_pos1=0;
for(j=0;j<strlen(line);j++){
if(line[j]=='[') {pos[j_pos]=j; j_pos++;} //'[' 位置标记
if(line[j]==']') {pos1[j_pos1]=j;j_pos1++;}//']' 位置标记
}
strncpy(rec[i].method, (line+pos[0]+1),pos1[0]-pos[0]-1);
strncpy(rec[i].ip, (line+pos[1]+1),pos1[1]-pos[1]-1);
strncpy(rec[i].protocol, (line+pos[2]+1),pos1[2]-pos[2]-1);
strncpy(rec[i].time, (line+pos[3]+1),pos1[3]-pos[3]-1);
strncpy(rec[i].add, (line+pos[4]+1),pos1[4]-pos[4]-1);
strncpy(rec[i].page, (line+pos[5]+1),pos1[5]-pos[5]-1);
strncpy(rec[i].port, (line+pos[6]+1),pos1[6]-pos[6]-1);
strncpy(rec[i].status, (line+pos[7]+1),pos1[7]-pos[7]-1);
strncpy(rec[i].exploer_info,(line+pos[8]+1),pos1[8]-pos[8]-1);
i++;
}
fclose(fp);//关闭文件
char buf[255],bufk[255];
int n=0,m=0,k,q,max_ip,max_pw;
int *a = new int[i],*b = new int[i],*p = new int[i];//统计数组
memset(a,0,sizeof(int)*i); //数组初始化
memset(b,0,sizeof(int)*i);
memset(p,0,sizeof(int)*i);
for(j=0;j<i;j++){
if(strcmp(rec[j].method,"GET")==0)n++;//GET请求统计 第2题
if(strlen(rec[j].port)>0)m++; //统计使用密码登录的次数 第5题
sscanf(rec[j].port,"%*[^&&]&&%[^\n]",buf); //取密码字符段
for(k=0;k<i;k++){
if(strcmp(rec[j].status,rec[k].status)==0) b[j]++;//状态码进行分析统计 第3题
if(strcmp(rec[j].ip, rec[k].ip)==0) a[j]++;//分析统计访问最多的客户IP地址 第4题
sscanf(rec[k].port,"%*[^&&]&&%[^\n]",bufk);
if(strcmp(buf,bufk)==0&&(strlen(rec[j].port)>0)&&(strlen(rec[k].port)>0))p[j]++;// 分析常用密码 第5题
}
}
printf("GET请求所占比例:%6.3f\n",1.0*n/i);//输出GET请求所占百分比; 第2题
max_ip = a[0];max_pw = p[0];k=0;q=0;
for(j=0;j<i;j++){
printf("rec[%d].status=%s:%6.3f\n",j,rec[j].status,b[j]*1.0/i);//输出所有访问状态码的比率 第3题
if(max_ip<a[j]) {max_ip=a[j];k=j;} // 找到访问最多次数的客户IP 第4题
if(max_pw<p[j]) {max_pw=p[j];q=j;} // 找到使用次数最多的密码 第5题
}
printf("访问最多的客户IP地址:%s,共访问:%d次.\n",rec[k].ip,a[k]);//输出访问最多的客户IP地址及次数 第4题
sscanf(rec[q].port,"%*[^&&]&&%[^\n]",buf);
printf("常用密码:%s,被用了%d次.在%d次登录中,%d次用密码登录.\n",buf,max_pw,i,m); //rec[q].port 第5题
delete [] a;delete [] b;delete [] p; //释放数组
//下面这段输出看看读入到rec[i]中的内容是否达预期目标,等程序调试完毕,这段可以删除,也可改成第6题的代码
//例子开始:
for(j=0;j<i;j++)
{
printf("\n%s %s %s %s %s %s %s %s %s \n",
rec[j].method,rec[j].ip, rec[j].protocol,
rec[j].time, rec[j].add, rec[j].page,
rec[j].port, rec[j].status,rec[j].exploer_info);
}
//结束
return 0;
}
//open file successful!
//GET请求所占比例: 0.818
//rec[0].status=200: 0.909
//rec[1].status=200: 0.909
//rec[2].status=200: 0.909
//rec[3].status=412: 0.091
//rec[4].status=200: 0.909
//rec[5].status=200: 0.909
//rec[6].status=200: 0.909
//rec[7].status=200: 0.909
//rec[8].status=200: 0.909
//rec[9].status=200: 0.909
//rec[10].status=200: 0.909
//访问最多的客户IP地址:233.102.79.50,共访问:9次.
//常用密码:password=123456,被用了6次.在11次登录中,8次用密码登录.
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123455 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//POST 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp 412 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123466 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.51 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//POST 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.80.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//请按任意键继续. . .
//题目要求是实现下面6个功能,我现在能写出的代码能实现前两个功能,和老师沟通过后,我代码存在的问题应该
//是没能把文件中信息存储在结构体中,我在代码中使用了strncpy_s函数,想把信息复制到结构体items中,但是后面
//的功能实现不了,已经卡在这里好久了,还是没有进步,能看看错在哪了吗?
//(1)对日志文件进行列表读取和写入;
//(2)计算日志文件中GET类型请求方式的占比;
//(3)对访问状态码进行分析与统计,计算所有访问状态码的比率;
//(4)分析访问最多的客户IP地址,并统计其访问次数;
//(5)分析常用密码,并统计密码使用次数;
//(6)用户输入时间段,查找该时间段内访问记录并输出到文件中
#include<stdio.h>
#include<string.h>
struct record //结构体
{
char method[255]; //[GET POST]
char ip[255]; //[ip]
char protocol[255];//[HTTP/1.1]
char time[255]; //[2021-01-18 08:57:44]
char add[255]; //[http://39.99.254.200:8810]
char port[255]; //[/admin/login.jsp]
char page[255]; //[passwd=admin123&&password=123456]
char status[255]; //[403]
char exploer_info[255];//[Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko]
};
struct record rec[2048];//文件有2048行
int main(void)
{
char line[1024];
int i=0,n=0,j,j_pos,j_pos1,pos[9],pos1[9];
FILE *fp;
fp=fopen("access.log","r+");//打开文件
if(!fp){
printf("false\n");
return -1;
}
else{
printf("open file successful!\n");
}
while((fgets(line,1024,fp))!=NULL){
j_pos=0,j_pos1=0;
for(j=0;j<strlen(line);j++){
if(line[j]=='[') {pos[j_pos]=j; j_pos++;} //'[' 位置标记
if(line[j]==']') {pos1[j_pos1]=j;j_pos1++;}//']' 位置标记
}
strncpy(rec[i].method, (line+pos[0]+1),pos1[0]-pos[0]-1);
strncpy(rec[i].ip, (line+pos[1]+1),pos1[1]-pos[1]-1);
strncpy(rec[i].protocol, (line+pos[2]+1),pos1[2]-pos[2]-1);
strncpy(rec[i].time, (line+pos[3]+1),pos1[3]-pos[3]-1);
strncpy(rec[i].add, (line+pos[4]+1),pos1[4]-pos[4]-1);
strncpy(rec[i].page, (line+pos[5]+1),pos1[5]-pos[5]-1);
strncpy(rec[i].port, (line+pos[6]+1),pos1[6]-pos[6]-1);
strncpy(rec[i].status, (line+pos[7]+1),pos1[7]-pos[7]-1);
strncpy(rec[i].exploer_info,(line+pos[8]+1),pos1[8]-pos[8]-1);
i++; //文件行数
}
fclose(fp);//关闭文件
for(j=0;j<i;j++){
if(strcmp(rec[j].method,"GET")==0)n++;//GET请求统计 第二题
}
printf("输出GET请求所占比例:%f\n",1.0*n/i);//输出日志文件内容并统计计数,输出所占百分比;
//下面这段输出看看读入到rec[i]中的内容是否达预期目标,等程序调试完毕,这段可以删除:
//例子开始:
for(j=0;j<i;j++)
{
printf("\n%s %s %s %s %s %s %s %s %s \n",
rec[j].method,rec[j].ip, rec[j].protocol,
rec[j].time, rec[j].add, rec[j].page,
rec[j].port, rec[j].status,rec[j].exploer_info);
}
//结束
return 0;
}
//open file successful!
//输出GET请求所占比例:0.818182
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//POST 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp 412 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//POST 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//GET 233.102.79.50 HTTP/1.1 2021-01-18 08:57:44 http://39.99.254.200:8810 /admin/login.jsp passwd=admin123&&password=123456 200 Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//请按任意键继续. . .