int init(void) /* initialize the simulator */ { int i; float sum, avg; float jimsrand(); printf("----- Stop and Wait Network Simulator Version 1.1 -------- \n\n"); printf("Enter the number of messages to simulate: "); scanf_s("%d",&nsimmax); printf("Enter packet loss probability [enter 0.0 for no loss]:"); scanf_s("%f",&lossprob); printf("Enter packet corruption probability [0.0 for no corruption]:"); scanf_s("%f",&corruptprob); printf("Enter average time between messages from sender's layer5 [ > 0.0]:"); scanf_s("%f",&lambda); printf("Enter TRACE:"); scanf_s("%d",&TRACE); srand(9999); /* init random number generator */ sum = 0.0; /* test random number generator for students */ for (i=0; i<1000; i++) sum=sum+jimsrand(); /* jimsrand() should be uniform in [0,1] */ avg = (float)(sum/1000.0); if (avg < 0.25 || avg > 0.75) { printf("It is likely that random number generation on your machine\n" ); printf("is different from what this emulator expects. Please take\n"); printf("a look at the routine jimsrand() in the emulator code. Sorry. \n"); return -9; } ntolayer3 = 0; nlost = 0; ncorrupt = 0; time=0.0; /* initialize time to 0.0 */ generate_next_arrival(); /* initialize event list */ return 0; }
int main() { struct event *eventptr; struct msg msg2give; struct pkt pkt2give; int i,j; init(); A_init(); B_init(); while (1) { eventptr = evlist; /* get next event to simulate */ if (eventptr==NULL) goto terminate; evlist = evlist->next; /* remove this event from event list */ if (evlist!=NULL) evlist->prev=NULL; if (TRACE>=2) { printf("\nEVENT time: %f,",eventptr->evtime); printf(" type: %d",eventptr->evtype); if (eventptr->evtype==0) printf(", timerinterrupt "); else if (eventptr->evtype==1) printf(", fromlayer5 "); else printf(", fromlayer3 "); printf(" entity: %d\n",eventptr->eventity); } time = eventptr->evtime; /* update time to next event time */ //if (nsim==nsimmax) //break; /* all done with simulation */ if (eventptr->evtype == FROM_LAYER5 ) { if(nsim < nsimmax -1) generate_next_arrival(); /* set up future arrival */ /* fill in msg to give with string of same letter */ j = nsim % 26; for (i=0; i<20; i++) msg2give.data[i] = 97 + j; if (TRACE>2) { printf(" MAINLOOP: data given to student: "); for (i=0; i<20; i++) printf("%c", msg2give.data[i]); printf("\n"); } nsim++; if (eventptr->eventity == A) A_rdtsend(msg2give); else B_rdtsend(msg2give); } else if (eventptr->evtype == FROM_LAYER3) { pkt2give.seqnum = eventptr->pktptr->seqnum; pkt2give.acknum = eventptr->pktptr->acknum; pkt2give.checksum = eventptr->pktptr->checksum; for (i=0; i<20; i++) pkt2give.payload[i] = eventptr->pktptr->payload[i]; if (eventptr->eventity ==A) /* deliver packet by calling */ A_rdtrcv(pkt2give); /* appropriate entity */ else B_rdtrcv(pkt2give); free(eventptr->pktptr); /* free the memory for packet */ } else if (eventptr->evtype == TIMER_INTERRUPT) { if (eventptr->eventity == A) A_timerinterrupt(); else B_timerinterrupt(); } else { printf("INTERNAL PANIC: unknown event type \n"); } free(eventptr); } terminate: printf(" Simulator terminated at time %f\n after sending %d msgs from layer5\n",time,nsim); return 0; }
int main(int argc, char **argv) { struct event *eventptr; struct msg msg2give; struct pkt pkt2give; int i,j; char c; int opt; int seed; //Check for number of arguments if(argc != 5){ fprintf(stderr, "Missing arguments\n"); printf("Usage: %s -s SEED -w WINDOWSIZE\n", argv[0]); return -1; } /* * Parse the arguments * http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html */ while((opt = getopt(argc, argv,"s:w:")) != -1){ switch (opt){ case 's': if(!isNumber(optarg)){ fprintf(stderr, "Invalid value for -s\n"); return -1; } seed = atoi(optarg); break; case 'w': if(!isNumber(optarg)){ fprintf(stderr, "Invalid value for -w\n"); return -1; } WINSIZE = atoi(optarg); break; case '?': break; default: printf("Usage: %s -s SEED -w WINDOWSIZE\n", argv[0]); return -1; } } init(seed); A_init(); B_init(); while (1) { eventptr = evlist; /* get next event to simulate */ if (eventptr==NULL) goto terminate; evlist = evlist->next; /* remove this event from event list */ if (evlist!=NULL) evlist->prev=NULL; if (TRACE>=2) { printf("\nEVENT time: %f,",eventptr->evtime); printf(" type: %d",eventptr->evtype); if (eventptr->evtype==0) printf(", timerinterrupt "); else if (eventptr->evtype==1) printf(", fromlayer5 "); else printf(", fromlayer3 "); printf(" entity: %d\n",eventptr->eventity); } time_local = eventptr->evtime; /* update time to next event time */ if (nsim==nsimmax) break; /* all done with simulation */ if (eventptr->evtype == FROM_LAYER5 ) { generate_next_arrival(); /* set up future arrival */ /* fill in msg to give with string of same letter */ j = nsim % 26; for (i=0; i<20; i++) msg2give.data[i] = 97 + j; if (TRACE>2) { printf(" MAINLOOP: data given to student: "); for (i=0; i<20; i++) printf("%c", msg2give.data[i]); printf("\n"); } nsim++; if (eventptr->eventity == A) A_output(msg2give); else B_output(msg2give); } else if (eventptr->evtype == FROM_LAYER3) { pkt2give.seqnum = eventptr->pktptr->seqnum; pkt2give.acknum = eventptr->pktptr->acknum; pkt2give.checksum = eventptr->pktptr->checksum; for (i=0; i<20; i++) pkt2give.payload[i] = eventptr->pktptr->payload[i]; if (eventptr->eventity ==A) /* deliver packet by calling */ A_input(pkt2give); /* appropriate entity */ else B_input(pkt2give); free(eventptr->pktptr); /* free the memory for packet */ } else if (eventptr->evtype == TIMER_INTERRUPT) { if (eventptr->eventity == A) A_timerinterrupt(); else B_timerinterrupt(); } else { printf("INTERNAL PANIC: unknown event type \n"); } free(eventptr); } terminate: //Do NOT change any of the following printfs printf(" Simulator terminated at time %f\n after sending %d msgs from layer5\n",time_local, nsim); printf("\n"); printf("Protocol: GBN\n"); printf("[PA2]%d packets sent from the Application Layer of Sender A[/PA2]\n", A_application); printf("[PA2]%d packets sent from the Transport Layer of Sender A[/PA2]\n", A_transport); printf("[PA2]%d packets received at the Transport layer of Receiver B[/PA2]\n", B_transport); printf("[PA2]%d packets received at the Application layer of Receiver B[/PA2]\n", B_application); printf("[PA2]Total time: %f time units[/PA2]\n", time_local); printf("[PA2]Throughput: %f packets/time units[/PA2]\n", B_application/time_local); return 0; }