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 + -
显示快捷键?