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