itgdecod.cpp

来自「D-ITG2.4源代码」· C++ 代码 · 共 1,314 行 · 第 1/3 页

CPP
1,314
字号
				infos.srcPort=9999;
				infos.destPort=8999;
				infos.flowId=1;}
			pktvalid++;
			if(flagbitrate||flagjitter||flagdelay||flagpktloss||flagsplit)
				split();
			sectxTime=((double)infos.txTime1*3600 + (double)infos.txTime2*60 + infos.txTime3);
      		secrxTime=((double)infos.rxTime1*3600 + (double)infos.rxTime2*60 + infos.rxTime3);

        	//Store flows informations
         	setline(sectxTime,secrxTime);
         	//Calculate average aggregate average delay and delay variation
			avdelay=avdelay+deltatime(sectxTime,secrxTime);
			delvariation=delvariation+((deltatime(sectxTime,secrxTime))*(deltatime(sectxTime,secrxTime)));
			if(secrxTime<secfirstline_gl)
				secfirstline_gl=secrxTime;
   			//Calculate aggregate average jitter
			if(flagfirstline){
				flagfirstline=0;
				lastdelay=deltatime(sectxTime,secrxTime);
				}
			else{
				avjitter=avjitter+fabs(lastdelay-deltatime(sectxTime,secrxTime));
				lastdelay=deltatime(sectxTime,secrxTime);
				}
			}//End current line valid
		} //End not empty line
	} //End reading input file

if(pktvalid==0){
	printf("Empty log file\n");
	//exit(1);
	}

if(flagbitrate||flagdelay||flagjitter||flagpktloss||flagsplit){
	//Close files created in split
	i=0;
	while ((int)memFile[i].flowId!=-1){
		memFile[i].FileId.close();
		i++;
		}
	}

if(flagbitrate||flagdelay||flagjitter||flagpktloss){
	//Calculate instantaneous values on splitted files
	elabsplit(flagbitrate, flagjitter, flagdelay, flagpktloss);

 	//Merge result files and delete individual result files
	char tempfilename[100]="";
	if(flagbitrate){
		merge(1);
		i=0;
		while((int)memFile[i].flowId!=-1){
			strcpy(tempfilename,memFile[i].FileName);
			strcat(tempfilename,".bit");
			if(remove(tempfilename)==-1){
				printf("Unable to remove file '%s'\n",tempfilename);
				perror("error ");
    			}
			i++;
			}
		}
	if(flagjitter){
		merge(2);
		i=0;
		while((int)memFile[i].flowId!=-1){
			strcpy(tempfilename,memFile[i].FileName);
			strcat(tempfilename,".jit");
			if(remove(tempfilename)==-1){
				printf("Unable to remove file '%s'\n",tempfilename);
				perror("error ");
				}
			i++;
			}
		}
	if(flagdelay){
		merge(3);
		i=0;
		while((int)memFile[i].flowId!=-1){
			strcpy(tempfilename,memFile[i].FileName);
			strcat(tempfilename,".del");
			if(remove(tempfilename)==-1){
				printf("Unable to remove file '%s'\n",tempfilename);
				perror("error ");
				}
			i++;
			}
		}
	if(flagpktloss){
		merge(4);
		i=0;
		while((int)memFile[i].flowId!=-1){
			strcpy(tempfilename,memFile[i].FileName);
			strcat(tempfilename,".pkt");
			if(remove(tempfilename)==-1){
				printf("Unable to remove file '%s'\n",tempfilename);
				perror("error ");
				}
			i++;
			}
		}
	}

if ((flagbitrate||flagdelay||flagjitter||flagpktloss)&&(!flagsplit)){
	i=0;
	while ((int)memFile[i].flowId!=-1){
		if(remove(memFile[i].FileName)==-1){
			printf("Unable to remove file '%s'\n",memFile[i].FileName);
			perror("error ");
   			}
		i++;
		}
	}
if(flagsplit){
    i=0;
    char strappo[130];
	while ((int)memFile[i].flowId!=-1){
	    strcpy(strappo,memFile[i].FileNWE);
	    strcat(strappo,".");
	    strcat(strappo,userstring);
	    strcat(strappo,".dat");
		if(rename(memFile[i].FileName,strappo)==-1){
			printf("Unable to rename file '%s'\n",memFile[i].FileName);
			perror("error ");
   			}
		i++;
		}
	}

if(elab_type==1){
	//Print results on screen
	double seclastline=0, pktrecv=0, byterecv=0;
	double maxdelay=0, mindelay=90000, pktloss=0;
	double totaltime=0;
	for(z=0;z<flownum;z++){
	    totaltime=deltatime(flowinfo[z].secfirstline,flowinfo[z].seclastline);
		pktrecv=pktrecv+flowinfo[z].pktrecv;
		byterecv=byterecv+flowinfo[z].byterecv;
		pktloss=pktloss+flowinfo[z].pktloss;
		if(seclastline<flowinfo[z].seclastline)
			seclastline=flowinfo[z].seclastline;
		if(maxdelay<flowinfo[z].maxdelay)
			maxdelay=flowinfo[z].maxdelay;
		if(mindelay>flowinfo[z].mindelay)
			mindelay=flowinfo[z].mindelay;
		flowinfo[z].avdelay=flowinfo[z].avdelay/(double)flowinfo[z].pktrecv;
		flowinfo[z].delvariation=flowinfo[z].delvariation/(double)flowinfo[z].pktrecv;
		flowinfo[z].delvariation=flowinfo[z].delvariation-(flowinfo[z].avdelay*flowinfo[z].avdelay);
		if(flowinfo[z].delvariation>0)
          flowinfo[z].delvariation=sqrt(flowinfo[z].delvariation);
        else
          flowinfo[z].delvariation=0;
        if(flowinfo[z].pktrecv>1)
  		  flowinfo[z].avjitter=flowinfo[z].avjitter/(double)(flowinfo[z].pktrecv-1);
		else
		  flowinfo[z].avjitter=0;
        printf("----------------------------------------------------------\n");
		printf("Flow number: %u\n",flowinfo[z].flowId);
		printf("From %s:%u", flowinfo[z].srcaddress, flowinfo[z].srcport);
		printf("\nTo    %s:%u\n", flowinfo[z].destaddress, flowinfo[z].destport);
		printf("----------------------------------------------------------\n");
		printf("Total time               = %13.6lf s\n",totaltime);
		printf("Total packets            = %13lu\n",flowinfo[z].pktrecv);
		printf("Minimum delay            = %13.6lf s\n",flowinfo[z].mindelay);
		printf("Maximum delay            = %13.6lf s\n",flowinfo[z].maxdelay);
		printf("Average delay            = %13.6lf s\n",flowinfo[z].avdelay);
		printf("Average jitter           = %13.6lf s\n",flowinfo[z].avjitter);
		printf("Delay standard deviation = %13.6lf s\n",flowinfo[z].delvariation);
		printf("Bytes received           = %13.0lf\n",flowinfo[z].byterecv);
		if(totaltime>0){
          printf("Average bitrate          = %13.6lf Kbit/s\n",flowinfo[z].byterecv*8/1000/totaltime);
		  printf("Average packet rate      = %13.6lf pkt/s\n",(double)flowinfo[z].pktrecv/totaltime);}
  		else{
          printf("Average bitrate          = %13.6lf Kbit/s\n",(double)0);
          printf("Average packet rate      = %13.6lf pkt/s\n",(double)0);}
        if(flowinfo[z].pktrecv>0)
          printf("Packets dropped          = %13lu (%3.2lf %%)\n",flowinfo[z].pktloss,(double)100*flowinfo[z].pktloss/(flowinfo[z].pktrecv+flowinfo[z].pktloss));
        else
          printf("Packets dropped          = %13u (%3.2lf %%)\n",0,(double)0);
        printf("----------------------------------------------------------\n");
		}
	totaltime=deltatime(secfirstline_gl,seclastline);
	avdelay=avdelay/(double)pktrecv;
	delvariation=delvariation/(double)pktrecv;
	delvariation=delvariation-(avdelay*avdelay);
	if(delvariation>0)
          delvariation=sqrt(delvariation);
    else
          delvariation=0;
    if(pktrecv>1)
        avjitter=avjitter/(pktrecv-1);
    else
        avjitter=0;
	printf("\n__________________________________________________________\n");
	printf("****************  TOTAL RESULTS   ******************\n");
	printf("__________________________________________________________\n");
	printf("Number of flows          = %13u\n",flownum);
 	printf("Total time               = %13.6lf s\n",totaltime);
	printf("Total packets            = %13.0lf\n",pktrecv);
	printf("Minimum delay            = %13.6lf s\n",mindelay);
	printf("Maximum delay            = %13.6lf s\n",maxdelay);
	printf("Average delay            = %13.6lf s\n",avdelay);
	printf("Average jitter           = %13.6lf s\n",avjitter);
	printf("Delay standard deviation = %13.6lf s\n",delvariation);
	printf("Bytes received           = %13.0lf\n",byterecv);
	if(totaltime>0){
      printf("Average bitrate          = %13.6lf Kbit/s\n",byterecv*8/1000/totaltime);
      printf("Average packet rate      = %13.6lf pkt/s\n",pktrecv/totaltime);}
	else{
      printf("Average bitrate          = %13.6lf Kbit/s\n",(double)0);
	  printf("Average packet rate      = %13.6lf pkt/s\n",(double)0);}
	if(pktrecv>0)
      printf("Packets dropped          = %13.0lf (%3.2lf %%)\n",pktloss, 100*pktloss/(pktrecv+pktloss));
	else
	  printf("Packets dropped          = %13.0u (%3.2u %%)\n",0,0);
    printf("Error lines              = %13lu\n",pkterr);
 	printf("----------------------------------------------------------\n");
	}//End print result on screen

//Close opened files and exit
if(logintype==0)
	inbin.close ();
else
	fclose(intxt);
if (flaglogout)
	if(logouttype==0)
		fclose (outtxt);
	else
		outbin.close();
if(flagoctave)
	fclose (octavefpout);
exit (0);
}
//*************************************************************************
//**************   END MAIN   *********************************************



ofstream *FlowPresent(unsigned int flowId,char *destAddr,char *srcAddr,unsigned int srcPort, unsigned int destPort){
int i=0;
while (i<MaxNumFlow){
	if ((memFile[i].flowId==flowId) && (strcmp(memFile[i].srcAddr,srcAddr)==0) &&
	(strcmp(memFile[i].destAddr,destAddr)==0)&&(memFile[i].srcPort==srcPort)&&(memFile[i].destPort==destPort)) break;
		i++;
	}
if (i!=MaxNumFlow) return &memFile[i].FileId;
else return NULL;
}


double deltatime( double time1, double time2){
	if(time2<time1)
		return time2-time1+(double)86400;
	else
		return time2-time1;
}


void readline(int filetype){
if(filetype == 0){
	//Read line from binary file
	inbin.read ((char *) &infos, sizeof (struct info));
	size = inbin.gcount ();
	}
else{
	//Read line from text file
	char buffer;
	if(fscanf(intxt, "Flow>%04u ", &infos.flowId)!= EOF){
		fscanf(intxt, "Seq>%7u ", &infos.seqNum);
#ifdef V23
        fscanf(intxt, "Src>%1c%15c/%u ", &buffer, &infos.srcAddr,&infos.srcPort);
		fscanf(intxt, "Dest>%1c%15c/%u ", &buffer, &infos.destAddr,&infos.destPort);
		fscanf(intxt, "TxTime>%u:%u:%lf ", &infos.txTime1, &infos.txTime2,&infos.txTime3);
		fscanf(intxt, "RxTime>%u:%u:%lf ", &infos.rxTime1, &infos.rxTime2,&infos.rxTime3);
#else
        fscanf(intxt, "Src>%1c%45c/%u ", &buffer, &infos.srcAddr,&infos.srcPort);
		fscanf(intxt, "Dest>%1c%45c/%u ", &buffer, &infos.destAddr,&infos.destPort);
		fscanf(intxt, "txTime>%u:%u:%lf ", &infos.txTime1, &infos.txTime2,&infos.txTime3);
		fscanf(intxt, "rxTime>%u:%u:%lf ", &infos.rxTime1, &infos.rxTime2,&infos.rxTime3);
#endif
		fscanf(intxt, "Size>%5u\n", &infos.size);
		if(infos.flowId==0){
			printf("\n Error reading input file\n");
			size=0;
			}
		else{
			size=1;}
		}
	else
		size = 0;
	}
}


void writeline(int filetype){
if(filetype==0){
	//Write line on text file
	fprintf (outtxt, "Flow>%04u ",infos.flowId);
	fprintf (outtxt, "Seq>%7u ", infos.seqNum);
#ifdef V23
    fprintf (outtxt, "Src>%16s/%hu ",infos.srcAddr,infos.srcPort);
	fprintf (outtxt, "Dest>%16s/%hu ",infos.destAddr,infos.destPort);
#else
    fprintf (outtxt, "Src>%46s/%hu ",infos.srcAddr,infos.srcPort);
	fprintf (outtxt, "Dest>%46s/%hu ",infos.destAddr,infos.destPort);
#endif
	fprintf (outtxt, "txTime>%u:%u:%lf ",infos.txTime1, infos.txTime2,infos.txTime3);
	fprintf (outtxt, "rxTime>%u:%u:%lf ",infos.rxTime1, infos.rxTime2,infos.rxTime3);
	fprintf (outtxt, "Size>%5u\n", infos.size);
	}
else{
	//Write line on binary file
	outbin.write((char *) &infos, sizeof (struct info));
	}
}


void setline(double txTime, double rxTime){
	double currentdelay = deltatime(txTime,rxTime);
	if(flownum==0){ //First flow
		flownum=1;
		flowinfo[0].flowId=infos.flowId;
		flowinfo[0].byterecv=infos.size;
		flowinfo[0].pktrecv=1;
		flowinfo[0].avdelay=currentdelay;
		flowinfo[0].delvariation=currentdelay*currentdelay;
		flowinfo[0].maxdelay=currentdelay;
		flowinfo[0].mindelay=currentdelay;
		flowinfo[0].secfirstline=rxTime;
		flowinfo[0].seclastline=rxTime;
		strncpy (flowinfo[0].srcaddress,infos.srcAddr,ADDRESSLEN);
		flowinfo[0].srcport=infos.srcPort;
		strncpy (flowinfo[0].destaddress,infos.destAddr,ADDRESSLEN);
		flowinfo[0].destport=infos.destPort;
		flowinfo[0].lastdelay=currentdelay;
		flowinfo[0].avjitter=0;
		flowinfo[0].pktloss=0;
		flowinfo[0].lastpktnum=infos.seqNum;
		flowinfo[0].pktdup=0;
		}
	else{//others flows
		int found = 0;
		int index = 0;
		if(flagfilter==2){
			found=1;
			index=0;
			}
		else{
			for (unsigned int z = 0; z < flownum; z++)
  				if ((flowinfo[z].flowId==infos.flowId)&&(strcmp(flowinfo[z].srcaddress,infos.srcAddr)==0)&&
      			(strcmp(flowinfo[z].destaddress,infos.destAddr)==0)&&(flowinfo[z].srcport==infos.srcPort)&&(flowinfo[z].destport==infos.destPort)){
      				found = 1;
  					index = z;
  					}
			}
		if(found){
			//Update current flow info
			flowinfo[index].byterecv+=infos.size;
			flowinfo[index].pktrecv++;
			flowinfo[index].avdelay=flowinfo[index].avdelay+currentdelay;
			flowinfo[index].delvariation=flowinfo[index].delvariation+(currentdelay*currentdelay);
			if(currentdelay>flowinfo[index].maxdelay){
			    //printf("Massimo %lf al numero seq %lu al tempo %lf\n",currentdelay,infos.seqNum,rxTime);
				flowinfo[index].maxdelay=currentdelay;}
			if(currentdelay<flowinfo[index].mindelay)
				flowinfo[index].mindelay=currentdelay;
			if(rxTime<flowinfo[index].secfirstline)
				flowinfo[index].secfirstline=rxTime;
			if(rxTime>flowinfo[index].seclastline)
				flowinfo[index].seclastline=rxTime;
			double jittemp = fabs(flowinfo[index].lastdelay-currentdelay);
			flowinfo[index].avjitter=flowinfo[index].avjitter+jittemp;
			if(infos.seqNum>(flowinfo[index].pktrecv+flowinfo[index].pktloss-flowinfo[index].pktdup))
				flowinfo[index].pktloss=infos.seqNum-flowinfo[index].pktrecv;
			else
			    if(infos.seqNum<(flowinfo[index].pktrecv+flowinfo[index].pktloss-flowinfo[index].pktdup)){
                   //printf("Warning pkt %lu duplicated\n",infos.seqNum);
                   flowinfo[index].pktdup++;
                   }
			flowinfo[index].lastpktnum=infos.seqNum;
			flowinfo[index].lastdelay=currentdelay;
			}
		else{
			//Create new flow info
			flownum++;
			flowinfo = (struct stflowinfo *) realloc (flowinfo,(flownum+1)*sizeof (struct stflowinfo));
			flowinfo[flownum-1].flowId=infos.flowId;
			flowinfo[flownum-1].byterecv=infos.size;
			flowinfo[flownum-1].pktrecv=1;
			flowinfo[flownum-1].avdelay=currentdelay;
			flowinfo[flownum-1].delvariation=currentdelay*currentdelay;
			flowinfo[flownum-1].maxdelay=currentdelay;
			flowinfo[flownum-1].mindelay=currentdelay;
			flowinfo[flownum-1].secfirstline=rxTime;
			flowinfo[flownum-1].seclastline=rxTime;
			strncpy (flowinfo[flownum-1].srcaddress,infos.srcAddr,ADDRESSLEN);
			flowinfo[flownum-1].srcport=infos.srcPort;
			strncpy (flowinfo[flownum-1].destaddress,infos.destAddr,ADDRESSLEN);
			flowinfo[flownum-1].destport=infos.destPort;
			flowinfo[flownum-1].lastdelay=currentdelay;
			flowinfo[flownum-1].avjitter=0;
			flowinfo[flownum-1].pktloss=0;
			flowinfo[flownum-1].lastpktnum=infos.seqNum;
			flowinfo[flownum-1].pktdup=0;
   			}//End create new flow info
		}//end other flows
}//****************  End setline


void split(){
int i=0;
ofstream *IdFile;
// Control if tripla is already present
IdFile=FlowPresent(infos.flowId,infos.destAddr,infos.srcAddr,infos.srcPort,infos.destPort);
if (IdFile!=NULL){  // if IdFile!=NULL the file is already open
	(*IdFile).write((char *) &infos, sizeof(struct info));
	if (!(*IdFile)) {
		printf("Unable to write file \n");
		perror("Split : ");
		exit(1);
		}
   }
else {// if tripla is not present
	i=0; //find first free position in structure memFile[]
	while ((memFile[i].flowId!=(unsigned int)-1) && (i<MaxNumFlow)){
		i++;
		}
	char buffer1[100]="";
	char buffer2[100]="";
	char* nameFileLog=buffer2;
	char flowIdString[33];
	sprintf(flowIdString,"%u",infos.flowId);
	strcat(nameFileLog,flowIdString);
	strcat(nameFileLog,"-");
	strcat(nameFileLog,infos.srcAddr);
	strcat(nameFileLog,"-");
	strcat(nameFileLog,infos.destAddr);
	strcpy(buffer1,buffer2);

⌨️ 快捷键说明

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