int main(int argc, char *argv[]){ int sockfd; FILE * testfile; int filelength, len; char * fname, * s; char msg[MSG_LEN]; int sent = 0; struct timeval starttime, endtime; double lapsed; if (argc != 3) { printf("Usage: %s 'server hostname' 'filename'\n", argv[0]); exit(0); } /* update random seed */ srand(time(NULL)); /* remove the above line if you want to get the same random sequence for each run - good for testing */ /* read in packet loss rate and error rate */ s = getenv("PACKET_LOSS_RATE"); if (s != NULL) LOSS_RATE = strtof(s, NULL); s = getenv("PACKET_ERR_RATE"); if (s != NULL) ERR_RATE = strtof(s, NULL); printf("PACKET_LOSS_RATE = %.2f, PACKET_ERR_RATE = %.2f\n", LOSS_RATE, ERR_RATE); fname=argv[2]; //open file if (!(testfile = fopen(fname, "r"))) { printf("Open file failed.\nProgram terminated."); exit(0); } printf("Open file successfully \n"); //get the file size fseek(testfile, 0L, SEEK_END); filelength = ftell(testfile); printf("File bytes are %d \n",filelength); fseek(testfile, 0L, SEEK_SET); // create RDT socket sockfd = rdt_socket(); //specify my own IP address & port number, because if I do not specify, others can not send things to me. rdt_bind(sockfd, CPORT); //specify the IP address & port number of my partner rdt_target(sockfd, argv[1], SPORT); /* a very simple handshaking protocol */ //send the size of the file memset(msg, '\0', MSG_LEN); sprintf(msg, "%d", filelength); rdt_send(sockfd, msg, strlen(msg)); //send the file name to server rdt_send(sockfd, fname, strlen(fname)); //wait for server response memset(msg, '\0', MSG_LEN); len = rdt_recv(sockfd, msg, MSG_LEN); if (strcmp(msg, "ERROR") == 0) { printf("Server experienced fatal error.\nProgram terminated.\n"); goto END; } else printf("Receive server response\n"); /* start the data transfer */ printf("Start the file transfer . . .\n"); gettimeofday(&starttime, NULL); // send the file contents while (sent < filelength) { if ((filelength-sent) < MSG_LEN) len = fread(msg, sizeof(char), filelength-sent, testfile); else len = fread(msg, sizeof(char), MSG_LEN, testfile); rdt_send(sockfd, msg, len); sent += len; usleep(1000); } gettimeofday(&endtime, NULL); printf("Complete the file transfer.\n"); lapsed = (endtime.tv_sec - starttime.tv_sec)*1.0 + (endtime.tv_usec - starttime.tv_usec)/1000000.0; printf("Total elapse time: %.3f s\tThroughtput: %.2f KB/s\n", lapsed, filelength/lapsed/1000.0); END: // close the file fclose(testfile); // close the rdt socket rdt_close(sockfd); printf("Client program terminated\n"); return 0; }
int main(int argc, char *argv[]) { int sockfd; char filepath[200]; char * s; char msg[MSG_LEN]; struct stat sbuf; FILE * testfile; int file_len, len; int received=0; if (argc != 2) { printf("Usage: %s 'client hostname'\n", argv[0]); exit(0); } /* update random seed */ srand(time(NULL)); /* remove the above line if you want to get the same random sequence for each run - good for testing */ /* check whether the folder exists */ if (stat(STORAGE, &sbuf) != 0) { printf("Directory ./%s does not exist!!\n", STORAGE); printf("Please create the directory %s before start up the server.\n", STORAGE); exit(0); } /* read in packet loss rate and error rate */ s = getenv("PACKET_LOSS_RATE"); if (s != NULL) LOSS_RATE = strtof(s, NULL); s = getenv("PACKET_ERR_RATE"); if (s != NULL) ERR_RATE = strtof(s, NULL); printf("PACKET_LOSS_RATE = %.2f, PACKET_ERR_RATE = %.2f\n", LOSS_RATE, ERR_RATE); // create RDT socket sockfd = rdt_socket(); //specify my own IP address & port number, because if I do not specify, others can not send things to me. rdt_bind(sockfd, SPORT); //specify the IP address & port number of my partner rdt_target(sockfd, argv[1], CPORT); /* a very simple handshaking protocol */ // wait for client request memset(msg, '\0', MSG_LEN); len = rdt_recv(sockfd, msg, MSG_LEN); file_len = atoi(msg); printf("Received client request: file size = %d\n", file_len); memset(msg, '\0', MSG_LEN); len = rdt_recv(sockfd, msg, MSG_LEN); sprintf(filepath, "%s/%s", STORAGE, msg); testfile = fopen(filepath, "w"); if (!testfile) { printf("Cannot open the target file: ./%s for write\n", filepath); // send the ERROR response memset(msg, '\0', MSG_LEN); sprintf(msg, "ERROR"); rdt_send(sockfd, msg, strlen(msg)); goto END; } else { printf("Open file %s for writing successfully\n", filepath); // send the ERROR response memset(msg, '\0', MSG_LEN); sprintf(msg, "OKAY"); rdt_send(sockfd, msg, strlen(msg)); } /* start the file transfer */ printf("Start receiving the file . . .\n"); // receive the file contents while (received < file_len) { memset(msg, 0, MSG_LEN); len = rdt_recv(sockfd, msg, MSG_LEN); fwrite(msg, sizeof(char), len, testfile); received += len; printf("Received a message of size %d bytes\n", len); } printf("Complete the file transfer.\n"); END: // close the file fclose(testfile); // close the rdt socket rdt_close(sockfd); printf("Server program terminated\n"); return 0; }