void print_statistics(int socktype, struct timeval start, struct timeval end, int total_bytes, int io) { int i; struct s_time_record *record; struct timeval tdiff, total_delay, avg_delay, sqrsum;// sdiv, tmp; int npackets = 0; double t_delay, t_avg, t_total; record = time_record_head.next; int last_seq = 1; struct s_seqlist *seqlist; total_delay.tv_sec = 0; total_delay.tv_usec = 0; sqrsum.tv_sec = 0; sqrsum.tv_usec = 0; while(record != NULL) { /* printf("%i ", record->seq); if(seqformat++ == 10) { printf("\n"); seqformat = 0; }*/ if(socktype == SOCK_DGRAM) { /* save potentially lost sequence numbers */ for(i = last_seq + 1; i < record->seq; i++) insert_seq(i); /* saved sequence number found. Delete it from lost-seq-number list */ if(last_seq > record->seq) delete_seq(record->seq); last_seq = record->seq; } tvsub(&tdiff, &(record->my_time), &(record->his_time)); /* delay */ tvadd(&total_delay, &total_delay, &tdiff); /* sum delay */ npackets++; record = record->next; } avg_delay.tv_sec = total_delay.tv_sec / npackets; avg_delay.tv_usec = total_delay.tv_usec / npackets; /* //standard diviation: record = time_record_head.next; while(record != NULL) { tvsub(&tdiff, &(record->my_time), &(record->his_time)); //delay tvsub(&tmp, &tdiff, &avg_delay); // x1 - mü tvsqr(&tmp); // (x - mü)^2 tvadd(&sdiv, &tmp); record = record->next; }*/ tvsub(&tdiff, &end, &start); t_avg = tvtosec(&avg_delay); t_total = tvtosec(&tdiff); t_delay = tvtosec(&total_delay); printf("\n\nprinting statistics:\n" \ "--------------------------\n"); printf("%i bytes received in %.2f seconds\n", total_bytes, t_total); printf("I/O calls: %i\n", io); printf("packets received: %i\n", npackets); printf("total delay: %.2f seconds\n", t_delay); printf("average delay: %f seconds\n", t_avg); /* printf("standard diviation: %ld seconds, %ld microseconds\n", sdiv.tv_sec / npackets, sdiv.tv_usec / npackets); */ /* print lost packets (only UDP) */ if(socktype == SOCK_DGRAM) { seqlist = seqlist_head.next; if(seqlist == NULL) printf("No packet loss\n"); else { int format = 0; int packetloss = 0; printf("\nPackets with the following sequence numbers are lost:\n\n"); while(seqlist != NULL) { packetloss++; printf("%i ", seqlist->val); seqlist = seqlist->next; if(format++ == 10) { printf("\n"); format = 0; } } printf("\n\nNumber of packets lost: %i\n", packetloss); } } printf("\n\n"); }
/********************************************************************** * Function util_menu() * * Parameter: * * * This function is the backbone of the interface. All file input/ouput * happens here. This is also where the user can key in their own string * if desired. Here the user can view, delete and list the available * sequences. * * **********************************************************************/ void util_menu() { int num_seqs, num_lines; while (1) { num_seqs = get_num_sequences(); num_lines = 14; printf("\n** String Utilites Menu **\n\n"); printf("1) Read formatted file\n"); printf("2) Read unformatted file\n"); printf("3) Create new sequence\n"); if (num_seqs == 0) printf("4) List sequences (currently available: None)\n"); else printf("4) List sequences (currently available: 1 - %d)\n", num_seqs); printf("5) Print sequence\n"); printf("6) Save sequences\n"); printf("7) Delete sequences\n"); printf("8) Set output options\n"); printf("0) Exit\n"); printf("\nEnter Selection: "); while ((choice = my_getline(stdin, &ch_len)) == NULL) ; switch (choice[0]) { case '0': return; case '1': fread_formatted(); break; case '2': fread_unformatted(); break; case '3': type_in_seq(); break; case '4': list_sequences(num_lines); break; case '5': print_seq(num_lines); break; case '6': fwrite_formatted(); break; case '7': delete_seq(); break; case '8': set_display_options(); break; default: printf("\nThat is not a choice.\n"); } } }