itgdecod.cpp

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

CPP
1,314
字号
	strcat(nameFileLog,".dat");
	
    memFile[i].FileId.open(buffer2, ios::out | ios::binary | ios::trunc);
    if (!memFile[i].FileId.is_open()) {
		printf("Unable to open file %s \n", buffer2);
		perror("ITGSplit main: ");
		exit(1);
        }
    // update struct with opened files
    memFile[i].flowId=infos.flowId;
    memFile[i].srcPort=infos.srcPort;
	memFile[i].destPort=infos.destPort;
    strncpy(memFile[i].srcAddr,infos.srcAddr,ADDRESSLEN);
    strncpy(memFile[i].destAddr,infos.destAddr,ADDRESSLEN);
    strcpy(memFile[i].FileName,buffer2);
    strcpy(memFile[i].FileNWE,buffer1);
	memFile[i].FileId.write((char *) &infos, sizeof(struct info));
    if (!memFile[i].FileId) {
		printf("Unable to write into file %s \n", buffer2);
		perror("Split main: ");
		exit(1);
		}
	} //end else
}


void elabsplit(int flagbit, int flagjit, int flagdel, int flagpkt){
//Compute instantaneous values for bitrate, jitter, delay and packet loss
//Using splitted files

int flagfirstline;
double secrxTime, secfirstline_loc=90000;
double secinitbitrate, tempbitrate;
double secinitjitter, tempjitter, lastdelay, currentdelay;
double secinitdelay, tempdelay;
double secinitpktloss;
unsigned long int intclosedbit, intclosedjit, intcloseddel, intclosedpkt; 
unsigned long int pktjitter, pktdelay, z, i=0;
unsigned long int pktrecv, pktloss, pktdup;
unsigned long int temppktloss, pktpktloss, totalpktloss;

while (memFile[i].flowId!=(unsigned int)-1){//For every flow
	ifstream inputfile;
	FILE *outfilebit;
	FILE *outfilejit;
	FILE *outfiledel;
	FILE *outfilepkt;
	char outfilename[100];
	
	//Open current output files
	if(flagbit){
		strcpy(outfilename,"");
		strcpy(outfilename,memFile[i].FileName);
		strcat(outfilename,".bit");
		if((outfilebit = fopen (outfilename, "w"))==NULL){
			printf ("Error opening file %s for write \n",outfilename);
			perror("error ");
			exit(1);
			}
		}
	if(flagjit){
		strcpy(outfilename,"");
		strcpy(outfilename,memFile[i].FileName);
		strcat(outfilename,".jit");
		if((outfilejit = fopen (outfilename, "w"))==NULL){
			printf ("Error opening file %s for write \n",outfilename);
			perror("error ");
			exit(1);
			}
		}
	if(flagdel){
		strcpy(outfilename,"");
		strcpy(outfilename,memFile[i].FileName);
		strcat(outfilename,".del");
		if((outfiledel = fopen (outfilename, "w"))==NULL){
			printf ("Error opening file %s for write \n",outfilename);
			perror("error ");
			exit(1);
			}
		}
	if(flagpkt){
		strcpy(outfilename,"");
		strcpy(outfilename,memFile[i].FileName);
		strcat(outfilename,".pkt");
		if((outfilepkt = fopen (outfilename, "w"))==NULL){
			printf ("Error opening file %s for write \n",outfilename);
			perror("error ");
			exit(1);
			}
		}
	//Open current input file
	inputfile.open(memFile[i].FileName, ios::in | ios::binary);
	if(!inputfile.is_open()){
		printf("Error opening file for aftersplit \n");
		perror("error ");
		exit(1);
		}
	else{//current input and output files are opened
		if(flagbit){
			intclosedbit=0;
			tempbitrate=0;
			}
		if(flagjit){
			intclosedjit=0;
			tempjitter=0;
			pktjitter=0;
			}
		if(flagdel){
			pktdelay=0;
			intcloseddel=0;
			tempdelay=0;
			}
		if(flagpkt){
			intclosedpkt=0;
			temppktloss=0;
			pktpktloss=0;
			totalpktloss=0;
			}
		flagfirstline=0;
		pktloss=0;
		pktdup=0;
		pktrecv=0;
		while (1){ //Scan input file
			inputfile.read((char *) &infos, sizeof(struct info));
 			size = inputfile.gcount();
 			if (size == 0) {//File is empty or finished
 				if(flagbit)
 					fprintf(outfilebit,"%lf %lf\n",intclosedbit*(double)msbitrate/1000,tempbitrate*8/msbitrate);
     			if(flagjit)
					fprintf(outfilejit,"%lf %lf\n",intclosedjit*(double)msjitter/1000,tempjitter/(double)(pktjitter-1));
    			if(flagdel)
    				fprintf(outfiledel,"%lf %lf\n",intcloseddel*(double)msdelay/1000,tempdelay/(double)pktdelay);
    			if(flagpkt)
    				fprintf(outfilepkt,"%lf %lu\n",intclosedpkt*(double)mspktloss/1000,temppktloss);
       			break;		
	    		}
 			else { //File is not finished
                 pktrecv++;
                 if(infos.seqNum>(pktrecv+pktloss-pktdup)){
                   pktloss=infos.seqNum-pktrecv;}
                 else
                     if(infos.seqNum<(pktrecv+pktloss-pktdup)){// Duplicated packet
                        pktdup++;
                        //printf("warning pkt dup on seq %lu\n",infos.seqNum);
                    }// End if (duplicated packet)
                    else { //Not duplicated packet
 				secrxTime=(double)(infos.rxTime1*3600)+(double)(infos.rxTime2*60)+infos.rxTime3;
 				currentdelay=deltatime(((double)infos.txTime1*3600)+((double)infos.txTime2*60)+(infos.txTime3),secrxTime);
     			if(!flagfirstline){
 					flagfirstline=1;
 					secfirstline_loc=secrxTime;
 					if(flagbit){
 						secinitbitrate=secfirstline_gl;
 						}
					if(flagjit){
						secinitjitter=secfirstline_gl;
						lastdelay=currentdelay;
						}
					if(flagdel){
 						secinitdelay=secfirstline_gl;
 						}
					if(flagpkt){
						secinitpktloss=secfirstline_gl;
						}
 					}
				if(flagbit){//Bitrate
 					if((secrxTime-secinitbitrate)>(msbitrate/1000)){//Print the bitrate value on file
                        //Calculate number of interval not closed
						double temporary =deltatime(secfirstline_gl,secrxTime)*1000/msbitrate;
						unsigned long int inttoclose=(unsigned long int)(ceil(temporary)- intclosedbit-1);
						if(inttoclose>0){
							//There are interval to close
							for(z=1;z<=inttoclose;z++){
								//For each interval to close
								if(((double)((intclosedbit+1)*msbitrate/1000)+secfirstline_gl)<secfirstline_loc){
									fprintf(outfilebit,"%lf %lf\n",intclosedbit*(double)msbitrate/1000,(double)0);}
								else{
        							fprintf(outfilebit,"%lf %lf\n",intclosedbit*(double)msbitrate/1000,tempbitrate*8/msbitrate);
									tempbitrate=0;
									}
								intclosedbit++;
								}//End for each interval to close
							}//End if there are interval to close
						secinitbitrate=(intclosedbit*msbitrate)/1000+secfirstline_gl;
						} //End if deltatime
	                //fprintf(outfilebit,"letti al sec: %lf bytes: %lf parziale: %lf\n",(secrxTime-secfirstline_gl),(double)infos.size,tempbitrate);
					tempbitrate+=(double)infos.size;
					}//End if (flagbit)
					
				if(flagjit){//Jitter
 					if((secrxTime-secinitjitter)>(msjitter/1000)){
						//Print the delay value on file
						double temporary =deltatime(secfirstline_gl,secrxTime)*1000/msjitter;
						unsigned long int inttoclose=(unsigned long int)(ceil(temporary)- intclosedjit-1);
						if(inttoclose>0){
							//There are interval to close
							for(z=1;z<=inttoclose;z++){
								//For each interval to close
								if(((double)((intclosedjit+1)*msjitter/1000)+secfirstline_gl)<secfirstline_loc){
									fprintf(outfilejit,"%lf %lf\n",intclosedjit*(double)msjitter/1000,(double)0);
									}
        						else{
									if(pktjitter>1){
										fprintf(outfilejit,"%lf %lf\n",intclosedjit*(double)msjitter/1000,tempjitter/(double)(pktjitter-1));
										pktjitter=1;
          								}
									else
										fprintf(outfilejit,"%lf %lf\n",intclosedjit*(double)msjitter/1000,(double)0);
									tempjitter=0;
									//pktjitter=0;
         							}
								intclosedjit++;
								}//End for each interval to close
							}//End if there are interval to close
						secinitjitter=intclosedjit*msjitter/1000+secfirstline_gl;	
						} //End if deltatime
					tempjitter=tempjitter+fabs(currentdelay-lastdelay);
 					pktjitter++;
 					lastdelay=currentdelay;
					}//End if (flagjit)

				if(flagdel){//Delay
 					if((secrxTime-secinitdelay)>(msdelay/1000)){
						//Print the delay value on file
						double temporary =deltatime(secfirstline_gl,secrxTime)*1000/msdelay;
						unsigned long int inttoclose=(unsigned long int)(ceil(temporary)- intcloseddel-1);
						if(inttoclose>0){
							//There are interval to close
							for(z=1;z<=inttoclose;z++){
								//For each interval to close
								if(((double)((intcloseddel+1)*(msdelay/1000))+secfirstline_gl)<secfirstline_loc)
									fprintf(outfiledel,"%lf %lf\n",intcloseddel*(double)msdelay/1000,(double)0);
								else{
									if(pktdelay>0){
										fprintf(outfiledel,"%lf %lf\n",intcloseddel*(double)msdelay/1000,tempdelay/(double)pktdelay);
										tempdelay=0;
										pktdelay=0;
										}
									else{
										fprintf(outfiledel,"%lf %lf\n",intcloseddel*(double)msdelay/1000,(double)0);
										}
									}
								intcloseddel++;
								}//End for each interval to close
							}//End if there are interval to close
						secinitdelay=intcloseddel*msdelay/1000+secfirstline_gl;	
						} //End if deltatime
					tempdelay=tempdelay+currentdelay;
 					pktdelay++;
					}//End if (flagdel)
					
				if(flagpkt){//Packet loss
 					if((secrxTime-secinitpktloss)>(mspktloss/1000)){
						//Print the packet loss value on file
						double temporary =deltatime(secfirstline_gl,secrxTime)*1000/mspktloss;
						unsigned long int inttoclose=(unsigned long int)(ceil(temporary)- intclosedpkt-1);
						if(inttoclose>0){
							//There are interval to close
							for(z=1;z<=inttoclose;z++){
								//For each interval to close
								if(((double)((intclosedpkt+1)*mspktloss/1000)+secfirstline_gl)<secfirstline_loc)
									fprintf(outfilepkt,"%lf %lu\n",intclosedpkt*(double)mspktloss/1000,(double)0);
								else{
									fprintf(outfilepkt,"%lf %lu\n",intclosedpkt*(double)mspktloss/1000,temppktloss);
									temppktloss=0;
									}
								intclosedpkt++;
								}//End for each interval to close
							}//End if there are interval to close
						secinitpktloss=intclosedpkt*mspktloss/1000+secfirstline_gl;	
						} //End if deltatime
					pktpktloss++;
					if(infos.seqNum>(pktpktloss+totalpktloss)){
 						temppktloss=temppktloss+infos.seqNum-pktpktloss-totalpktloss;
 						totalpktloss=infos.seqNum-pktpktloss;
       					}
					}//End if (flagpkt)
                  }	// End Else (not duplicated packet)
				}//End else (size !=0)
			}//End while (1)	
   		}//End Else (current input and output file are opened)
	i++;
	inputfile.close();
	if(flagbit)
		fclose(outfilebit);
	if(flagjit)
		fclose(outfilejit);
	if(flagdel)
		fclose(outfiledel);
	if(flagpkt)
		fclose(outfilepkt);
	}//End while every flow 
}//End aftersplit()


void merge(int type){
//Merge elabsplit output files for bitrate, jitter, packet loss and delay

unsigned int i =0, finishedfiles, flagfirstfile, flagbreak;
FILE *fpout;
double time, value, valuesum;
char extension[4]="";
char colname[100]="";

//Open output file
switch (type){
	case 1:
		strcpy(extension,".bit");
		if((fpout = fopen ("bitrate.dat", "w"))==NULL){
			printf ("Error opening file 'bitrate.dat' for write");
			perror("error ");
			exit (1);
			}
		break;
	case 2:
		strcpy(extension,".jit");
		if((fpout = fopen ("jitter.dat", "w"))==NULL){
			printf ("Error opening file 'jitter.dat' for write");
			perror("error ");
			exit (1);
			}
		break;
	case 3:
		strcpy(extension,".del");
		if((fpout = fopen ("delay.dat", "w"))==NULL){
			printf ("Error opening file 'delay.dat' for write");
			perror("error ");
			exit (1);
			}
		break;
	case 4:
		strcpy(extension,".pkt");
		if((fpout = fopen ("packetloss.dat", "w"))==NULL){
			printf ("Error opening file 'pktloss.dat' for write");
			perror("error ");
			exit (1);
			}
		break;
	}

fprintf(fpout,"Time");
//Open input files
while (memFile[i].flowId!=(unsigned int)-1){
	char tempfilename[100]="";
	strcat(tempfilename,memFile[i].FileName);
	strcat(tempfilename,extension);
	if((memFile[i].tempfile = fopen (tempfilename, "r"))==NULL){
		printf ("\n Error opening log file '%s'\n",tempfilename);
		perror("error ");
		exit (1);
		}
	//Create and print header string for the oputput file
	sprintf(colname,"%u",memFile[i].flowId);
	strcat(colname,"-");
	strcat(colname,memFile[i].srcAddr);
	strcat(colname,"-");
	strcat(colname,memFile[i].destAddr);
	fprintf(fpout," %s",colname);
	strcpy(colname,"");
	
	i++;
	}
	fprintf(fpout," Aggregate-Flow\n");
while (1){
	flagfirstfile=0;
	i=0;
	flagbreak=0;
	finishedfiles=0;
	valuesum=0;
	while (memFile[i].flowId!=(unsigned int)-1){
		if(fscanf(memFile[i].tempfile,"%lf %lf\n", &time, &value)==EOF){
			flagbreak++;
			finishedfiles++;
			}
		else{
			valuesum=valuesum+value;
			if(!flagfirstfile){
				flagfirstfile=1;
				fprintf(fpout,"%lf",time);
				}
			while (finishedfiles>0){ //New version
			   fprintf(fpout," %lf",(double)0);
			   finishedfiles--;
               }    
			fprintf(fpout," %lf",value);
			}
		i++;
		if((memFile[i].flowId==(unsigned int)-1)&&(flagbreak!=flownum)){
		    if(finishedfiles>0)
                  fprintf(fpout," %lf",(double)0);
			fprintf(fpout," %lf\n",valuesum);
			}			
		}
	if(flagbreak==flownum)
		break;
	}
i=0;
while(memFile[i].flowId!=(unsigned int)-1){
	fclose(memFile[i].tempfile);
	i++;
	}
fclose(fpout);
}


void printhelp(){
printf ("\n");
printf (" Name\n");
printf ("          ITGDec - Decoder component of D-ITG platform\n\n");
printf (" Synopsis\n");
printf ("          ./ITGDec [<logfile> [-v|-i][-s <string>][-l <text_log_file>]\n");
printf ("          [-o <octave_log_file>][-d <delay_interval_size>]\n");
printf ("          [-j <jitter_interval_size>][-b <bitrate_interval_size>]\n");
printf ("          [-p <packetloss_interval_size>][-f <max_flow_num>]]|[-h|--help]\n\n");
printf (" Options\n");
printf (" -d <DT>           generate 'delay.dat' file with average delay\n");
printf ("                   every <DT> milliseconds\n\n");
printf (" -j <JT>           generate 'jitter.dat' file with average jitter\n"); 
printf ("                   every <JT> milliseconds\n\n");
printf (" -b <BT>           generate 'bitrate.dat' file with average bitrate\n"); 
printf ("                   every <BT> milliseconds\n\n");
printf (" -p <PT>           generate 'packetloss.dat' file with average packet loss\n"); 
printf ("                   every <PT> milliseconds\n\n");
printf (" -v                generate total result for visualization\n\n");
printf (" -i                generate total result for import\n\n");
printf (" -t                input log file is text file\n\n");
printf (" -l <outlog>       generate decoded log file with name <outlog> \n\n");
printf (" -o <outfile>      generate decoded log file with name <outfile>\n");
printf ("                   for octave/matlab import\n\n");
printf (" -s <string>       split input file for every flow and\n"); 
printf ("                   add <string> to its name\n\n");
printf (" -f <flownum>      consider only packets of flows <= <flownum>\n");
printf ("                   if <flownum> = 't' consider all packets as\n"); 
printf ("                   belonging to the same flow\n\n");
printf (" -h | --help       display this help and exit\n\n");
printf ("\n For more information consult the help file the home directory\n");
}

⌨️ 快捷键说明

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