/* to compile do: gcc -g -o server server.c -lsocket -lnsl */ #include #include #include #include #include int main(int argc, char **argv) { int sockfd, i, j, n, loss, size, val, flag, port, count, delay; struct sockaddr_in servaddr,cliaddr; float floss; socklen_t len; unsigned char init[101], filename[11], client[21]; unsigned short *mesg; FILE *fpi; if (argc != 2) { printf ("\nusage: exec \n"); exit (0); } sockfd=socket(AF_INET,SOCK_DGRAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY); servaddr.sin_port=htons(atoi(argv[1])); bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); for (i = 0; i < 101; i++) { init[i] = 0; } for (;;) { flag = 0; n = recvfrom (sockfd, init, 100*sizeof(char), 0, (struct sockaddr *) &cliaddr, &len); printf ("\n%s\n", init); sscanf (init, "%s %d %s %d %f", client, &port, filename, &size, &floss); strcat (filename, ".au"); printf ("\n----------------------------------\n"); loss = (int) (100*floss); printf ("\nThe client IPaddess : %s", client); printf ("\nThe port number : %d", port); printf ("\nThe requested file : %s", filename); printf ("\nThe size of each datagram : %d", size); printf ("\nThe loss percentage : %d", loss); printf ("\n\nSending "); delay = (int)(1000*size/8); mesg = (unsigned short *) malloc (sizeof (unsigned short)*size); if ((fpi = fopen(filename, "r")) != NULL) flag = 1; else flag = 0; if (flag == 1) { count = 0; while (fread (mesg, sizeof (unsigned short), size, fpi) != '\0') { val = 1 + (int)(100.0*rand()/(RAND_MAX + 1.0)); if ((loss < val) || (count == 0)) { sendto (sockfd, mesg, size*sizeof(unsigned short), 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); for (i = 0; i < size; i++) { mesg[i] = 0; } } else { for (i = 0; i < size; i++) { mesg[i] = 0; } /*sendto (sockfd, mesg, size*sizeof(unsigned short), 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));*/ } count++; printf ("."); usleep(delay); } fclose (fpi); sendto (sockfd, NULL, sizeof(unsigned char), 0, (struct sockaddr *) &cliaddr, sizeof(cliaddr)); printf ("\nSent last packet .. \n"); break; } else { continue; } } printf ("\n\n\n\n"); return 0; }