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

📄 checkdns.c

📁 我的本科生毕业设计
💻 C
字号:
#include "checkDNS.h"#include "reportToConsole.h"/*this file must all modifye TODO:*/int DNSSockFd[MaxDNSUrl];struct sockaddr_in ServAddr[MaxDNSUrl];long long DNSsendPacket[MaxDNSUrl];long long DNSrecvPacket[MaxDNSUrl];char DNSprotocolPacket[MAX_PACKET];int DNSaSendNum;int DNSaRecvNum;time_t DNSsTime,DNSeTime;fd_set DNSreadSet,DNStestSet;char DNStmpcheck[100];extern FILE *DNSLogFd;void DNSanalysis(){	int i;	float rate;	int downNum = 0;	int notSmoothNum = 0;	int wellNum = 0;	for (i = 0;i < DNSUrlNum;i++)	{		if (DNSSockFd[i] != -1)		{				rate =(float) DNSrecvPacket[i]/DNSsendPacket[i];/*  rate of pocket recv */			if (rate < RATE_LEVEL)			{				notSmoothNum++;				sprintf(DNStmpcheck,"[WARNING] DNS server:%s is not smooth;the rate is %f\n",DNSUrl[i],rate);				display(textDNSBuff,DNStmpcheck,DNSLogFd);			}			else			{				wellNum++;				sprintf(DNStmpcheck,"[OK] DNS server:%s is well,the rate is:%f\n",DNSUrl[i],rate);				display(textDNSBuff,DNStmpcheck,DNSLogFd);			}		}		else			downNum++;	}	if (DNSServFd != -1)		reportToConsole("DNS",DNSServFd,downNum,notSmoothNum,wellNum);}int DNSsearchFd(int fd){	int i;	for (i = 0;i < DNSUrlNum;i++)	{		if (fd == DNSSockFd[i])			break;	}	return i;}void DNSnewSockFd(){	int i;	for (i = 0;i < DNSUrlNum;i++)	{		close(DNSSockFd[i]);		servConnect_digram(DNSUrl[i],&(DNSSockFd[i]),&(ServAddr[i]),DNSPort,textDNSBuff,DNSLogFd); 	}}void DNSmkSendPacket(){	int i;	bzero(&DNSprotocolPacket,sizeof(DNSprotocolPacket));	genDNSPacket(DNSUrl[0],DNSprotocolPacket); /*DNSUrl[0] will not be used in the function*/}void DNSsendData(){	int i;	DNSaSendNum = 0;	for (i = 0;i < DNSUrlNum;i++)		{			if (DNSSockFd[i] != -1)			{				int res;				int sendBuffSize = 33; /*haha , i has caculate it*/				int len = sizeof(ServAddr[i]);				res = sendto(DNSSockFd[i],DNSprotocolPacket,sendBuffSize,0,(struct sockaddr*)&(ServAddr[i]),len);				if (res == -1) 				{					sprintf(DNStmpcheck,"[FAILURE] DNS server:%s is down\n",DNSUrl[i]);					close(DNSSockFd[i]);					FD_CLR(DNSSockFd[i],&DNSreadSet);					FD_CLR(DNSSockFd[i],&DNStestSet);					DNSSockFd[i] = -1;					display(textDNSBuff,DNStmpcheck,DNSLogFd);					continue;				}				else  				{					DNSaSendNum++;					DNSsendPacket[i]++;				}			}		}}void DNSselectHandle(){	char recvBuff[1024];	int fd;	for (fd = 0;fd < FD_SETSIZE;fd++)	{		if (FD_ISSET(fd,&DNStestSet))		{			int id;			id = DNSsearchFd(fd);			DNSaRecvNum++;			int nread;			ioctl(fd,FIONREAD,&nread);			if (nread == 0)			{				sprintf(DNStmpcheck,"[WARNING] DNS server:%s is not normal\n",DNSUrl[id]);				display(textDNSBuff,DNStmpcheck,DNSLogFd);			}			else			{				int res;				int len = sizeof(ServAddr[id]);				res = recvfrom(DNSSockFd[id],recvBuff,sizeof(recvBuff),0,(struct sockaddr*)&(ServAddr[id]),&len);								DNSrecvPacket[id]++;				sprintf(DNStmpcheck,"[MESSAGE] DNS server:%s send %lld packets,ans receive %lld packets\n",						DNSUrl[id],DNSsendPacket[id],DNSrecvPacket[id]);				display(textDNSBuff,DNStmpcheck,DNSLogFd);			}		}	}}void  DNSresetSet(){	int i;	FD_ZERO(&DNSreadSet);	for (i = 0;i < DNSUrlNum;i++)	{		if (DNSSockFd[i] != -1)			FD_SET(DNSSockFd[i],&DNSreadSet);	}}void DNShandle(){	time_t s_t,e_t;	int i;	struct timeval timeOut;	DNSnewSockFd(); /*make the dns url connect*/	DNSresetSet(); 	/*add the socket to the readset*/	DNSaRecvNum = 0;	DNSsendData();	s_t = time((time_t*)0);	while (1)	{		DNStestSet = DNSreadSet;		timeOut.tv_sec = SELECT_TIME_SEC;		timeOut.tv_usec = SELECT_TIME_USEC; /* time out is 1 second */		int res;		res = select(FD_SETSIZE,&DNStestSet,(fd_set*)NULL,(fd_set*)NULL,&timeOut);		switch(res)		{			case 0 ://				printf("time out\n");//				sprintf(DNStmpcheck,"time out\n");//				display(textDNSBuff,DNStmpcheck,DNSLogFd);				break;			case -1 ://				printf("dns select\n");				break;			default :				DNSselectHandle();				s_t = time((time_t*)0);				break;		}		e_t = time((time_t*)0);		double diff_t;		diff_t = difftime(e_t,s_t);		if (DNSaRecvNum >= DNSaSendNum || diff_t > RECV_TIME_OUT )  /*time  controll*/			break;	}}void checkDNS(){	int i ;	for (i = 0;i <DNSUrlNum;i++)		DNSsendPacket[i] = DNSrecvPacket[i] = 0;	DNSsTime = time((time_t*)0);	DNSmkSendPacket();	while (running)	{		DNShandle();		DNSeTime = time((time_t*)0);		double diffTime;		diffTime = difftime(DNSeTime,DNSsTime);		if (diffTime >= CHECK_TIME_VAL)  /* check between CHECK_TIME_VAL*/		{			DNSsTime = DNSeTime;			DNSanalysis(); /*  analays 	the 		all		 socket */		}		sleep(1);	}}

⌨️ 快捷键说明

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