📄 checkdns.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 + -