void get_server(receiver_param *rp, struct frame_t *frame_info) { error_code_t e; FILE *stream; long file_size; stream = fopen(frame_info->data, "r"); if(!stream) { if(errno == EACCES) send_error(rp->source_sd, NO_PERMISSION, 0); else if (errno == ENOENT) send_error(rp->source_sd, NO_FILE, 0); return; } file_size = get_file_size(stream); e = send_d(rp, (char*)&file_size, sizeof(long), 0); if(e != OK) { fclose(stream); return; } file_transfer(rp, stream, 1, file_size); fclose(stream); }
error_code_t put(receiver_param *rp, const char *command) // ou sd ao invez do rp { char *file_name; unsigned char name_size; long file_size; error_code_t e; FILE *stream; if (command[3] != ' ' && command[3] != '\0') return INV_CMD; file_name = (char*)&command[4]; name_size = (unsigned char)strlen(file_name); if (name_size > DATA_MAX_SIZE) return BIG_NAME; stream = fopen(file_name, "r"); if (!stream) { switch (errno) { case EACCES: return NO_PERMISSION; case ENOENT: return NO_FILE; } } e = remote_command(rp, 'P', file_name, name_size, NULL); if (e != OK) { fclose(stream); return e; } file_size = get_file_size(stream); // tamanho do arquivo e = send_d(rp, (char*)&file_size, sizeof(long), 1); // talvez colocar mais coisas que o tamanho do arquivo if (e != OK) { fclose(stream); return e; } file_transfer(rp, stream, 2, file_size); fclose(stream); return OK; }
int main(int argc, char *argv[]) { int portno = atoi(argv[1]); // we got the port through it file_transfer(portno); // char c; // while(scanf("%c",&c)!=EOF){ // switch(c){ // case '\n': // // // break; // case // } // } return 0; }
//连接后调用 void start_connet(struct client_info *client_info) { int ret=0; int fd=client_info->fd; // printf("some one connect in...\nhis ip is %s",inet_ntoa(client_info->sockaddr->sin_addr)); ret=file_transfer(client_info->fd,file_path); if(ret<0) { printf("file receive error. exit\n"); exit(-1); } printf("transfer successfully... \n"); }
// Define main() function for stage 1 of the communication. int main(int argc, char *argv[]) { int sockfd, new_fd; // Listen on sock_fd, new connection on new_fd. struct addrinfo hints, *servinfo, *p; struct sockaddr_storage their_addr; // Client's address information. socklen_t sin_size; struct sigaction sa; int yes=1; char s[INET6_ADDRSTRLEN]; // Variable to store the string representation of the client's IP address. int rv; char buf[10000]; int numbytes; int n_port = atoi(argv[1]); if ((n_port < 1024) || (n_port > 65535)) { fprintf(stderr, "n_port must be between 1024 and 65535."); return 1; } // Generate random port number for the stage 2 of the communication - transaction using UDP sockets. srand (time(NULL)); int r_port = (rand() % 64512) + 1024; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; // use my IP // Get the address info of the client. if ((rv = getaddrinfo(NULL, argv[1], &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo() error: %s.", gai_strerror(rv)); return 1; } // Loop through all the results and bind to the first client. for(p = servinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("socket() error."); continue; } if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { perror("setsockopt() error."); exit(1); } if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { close(sockfd); perror("bind() error."); continue; } break; } // Free the address info variables retrieved. freeaddrinfo(servinfo); if (p == NULL) { fprintf(stderr, "Server failed to bind."); exit(1); } if (listen(sockfd, 10) == -1) { perror("listen() error."); exit(1); } sa.sa_handler = sigchld_handler; // Reap all dead processes. sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction(SIGCHLD, &sa, NULL) == -1) { perror("sigaction() error."); exit(1); } while(1) { // Main loop. sin_size = sizeof their_addr; new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size); // Accept connection from the client. if (new_fd == -1) { perror("accept() error."); continue; } // Store the readable IP address of the client in variable s. inet_ntop(their_addr.ss_family, get_in_addr((struct sockaddr *)&their_addr), s, sizeof s); while(1) { // Connection error. if ((numbytes = recv(new_fd, buf, sizeof(buf), 0)) == -1) { perror("recv() error."); exit(1); } // Client connection closed. else if (numbytes == 0) { printf("Connection closed.\n"); // Server still listening to other connections break; } // Connection success. printf("\nNegotiation detected. Selected random port %d\n\n", r_port); // Send r_port to the client. if ((send(new_fd, &r_port, sizeof(int), 0)) == -1) { fprintf(stderr, "Sending r_port failed.\n"); } close(new_fd); // Close the TCP connection with the client. break; } // Negotiation phase (stage 1) complete. Move to UDP transaction. file_transfer(r_port); break; } return 0; // Return from the function. }
void parse_command(char option[]) { int registerfd, consock; char server_ip[15], dest[100], filename[100], file1[100], file2[100], file3[100]; char *token; char para1[50], para2[50], para3[50]; int conid1 = 0, conid2 = 0, conid3 = 0, server_port, con_port, tid, uid; const char s[2] = " "; //parsing work token = strtok(option, s); if ((strcmp(token, "REGISTER") == 0) || (strcmp(token, "register") == 0)) { token = strtok(NULL, s); if (token == NULL) { fprintf(stderr, "\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n"); return; } strcpy(para1, token); token = strtok(NULL, s); if (token == NULL) { fprintf(stderr, "\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n"); return; } strcpy(para2, token); server_port = atoi(para2); strcpy(server_ip, para1); if (strcmp("128.205.36.8", server_ip) != 0) { fprintf(stderr, "\nSERVER IP INCORRECT\n"); } else { registerfd = register_serv(server_ip, server_port); FD_SET(registerfd, &readfds); } } else if ((strcmp(token, "CONNECT") == 0) || (strcmp(token, "connect") == 0)) { token = strtok(NULL, s); if (token == NULL) { fprintf(stderr, "\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n"); return; } strcpy(dest, token); token = strtok(NULL, s); if (token == NULL) { fprintf(stderr, "\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n"); return; } con_port = atoi(token); consock = connect_client(dest, con_port); if (consock == -1) fprintf(stderr, "\nIMPROPER CONNECTION\n"); else FD_SET(consock, &readfds); } else if ((strcmp(token, "UPLOAD") == 0) || (strcmp(token, "upload") == 0)) { token = strtok(NULL, s); if (token == NULL) { fprintf(stderr, "\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n"); return; } uid = atoi(token); token = strtok(NULL, s); if (token == NULL) { fprintf(stderr, "\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n"); return; } strcpy(filename, token); fprintf(stderr, "\nUPLOADING FILE %s TO CONNECTION %d", filename, uid); if (uid == 1) { fprintf(stderr, "\nUPLOAD TO SERVER NOT ALLOWED\n"); } else { int i; for (i = 1; i < 4; i++) { if (mycon[i].con_id == uid) break; } if (i == 4) { fprintf(stderr, "\nNO SUCH CONNECTION\n"); } else { int val = file_transfer(mycon[i].confd, filename); if (val == -1) fprintf(stderr, "\n\nERROR IN FILE TRANSFER\n\n"); } } } else if ((strcmp(token, "DOWNLOAD") == 0) || (strcmp(token, "download") == 0)) { token = strtok(NULL, s); if (token == NULL) { fprintf(stderr, "\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n"); return; } conid1 = atoi(token); token = strtok(NULL, s); if (token == NULL) { fprintf(stderr, "\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n"); return; } strcpy(file1, token); token = strtok(NULL, s); if (token != NULL) { conid2 = atoi(token); token = strtok(NULL, s); if (token != NULL) { strcpy(file2, token); token = strtok(NULL, s); if (token != NULL) { conid3 = atoi(token); token = strtok(NULL, s); if (token != NULL) { strcpy(file3, token); } else { fprintf(stderr, "\nINCORRECT COMMAND\n"); } } } else { fprintf(stderr, "\nINCORRECT COMMAND"); } } if ((conid1 == 1) || (conid2 == 1) || (conid3 == 1)) { fprintf(stderr, "\nDOWNLOAD FROM SERVER NOT ALLOWED\n"); if (conid1 == 1) conid1 = 0; else if (conid2 == 1) conid2 = 0; else conid3 = 0; } if (conid1 != 0) { fprintf(stderr, "\nDOWNLOADING FILE %s FROM CONNECTION %d\n", file1, conid1); int val = download_file(file1, conid1); if (val == -1) fprintf(stderr, "ERROR IN FILE TRNSFER %s", file1); } if (conid2 != 0) { fprintf(stderr, "\nDOWNLOADING FILE %s FROM CONNECTION %d\n", file2, conid2); int val = download_file(file2, conid2); if (val == -1) fprintf(stderr, "ERROR IN FILE TRNSFER %s", file1); } if (conid3 != 0) { fprintf(stderr, "\nDOWNLOADING FILE %s FROM CONNECTION %d\n", file3, conid3); int val = download_file(file3, conid3); if (val == -1) fprintf(stderr, "ERROR IN FILE TRNSFER %s", file1); } } else if ((strcmp(token, "TERMINATE") == 0) || (strcmp(token, "terminate") == 0)) { token = strtok(NULL, s); if (token == NULL) { fprintf(stderr, "\nINCORRECT INPUT TYPE 'HELP' FOR MORE INFORMATION\n"); return; } tid = atoi(token); fprintf(stderr, "\n TERMINATING CONNECTION ID %d\n", tid); terminate_con(tid); } else if ((strcmp(token, "EXIT") == 0) || (strcmp(token, "exit") == 0)) { fprintf(stderr, "\nEXITING.....\n"); exit(1); } else if ((strcmp(token, "MYPORT") == 0) || (strcmp(token, "myport") == 0)) { fprintf(stderr, "\nMY PORT IS:%d\n", PORTNO); } else if ((strcmp(token, "LIST") == 0) || (strcmp(token, "list") == 0)) { display_con(); } else if ((strcmp(token, "CREATOR") == 0) || (strcmp(token, "creator") == 0)) { fprintf(stderr, "\nCREATOR:Pratik Gajanan Deshpande\npdeshpan\[email protected]\n"); } else if ((strcmp(token, "MYIP") == 0) || (strcmp(token, "myip") == 0)) { myipis(); fprintf(stderr, "\nMY IP IS:%s\n", myip); } else if ((strcmp(token, "HELP") == 0) || (strcmp(token, "help") == 0)) { help(); } else { fprintf(stderr, "\nINCORRECT COMMAND PLEASE TYPE 'HELP' IF REQUIRED\n"); } }
void client() { int consock, registerfd, server_sockfd, client_sockfd; int server_len, client_len; struct sockaddr_in server_address; struct sockaddr_in client_address; int result; char option[1024]; // consock=connect_client(2); server_sockfd = socket(AF_INET, SOCK_STREAM, 0); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(PORTNO); server_len = sizeof(server_address); bind(server_sockfd, (struct sockaddr *) &server_address, server_len); listen(server_sockfd, 5); //initializing readfds to sockfd. FD_ZERO(&readfds); FD_SET(server_sockfd, &readfds); FD_SET(0, &readfds); while (1) // waiting for client requests { int fd; int nread; char ch[1024]; testfds = readfds; result = select(FD_SETSIZE, &testfds, (fd_set *) 0, (fd_set *) 0, (struct timeval *) 0); if (result <= 0) { perror("Error"); exit(1); } if (FD_ISSET(0, &testfds)) { memset(option, '\0', 1024); fgets(option, 1024, stdin); option[strlen(option) - 1] = '\0'; parse_command(option); } else { for (fd = 0; fd < FD_SETSIZE; fd++) { if (FD_ISSET(fd, &testfds)) { if (fd == server_sockfd) { client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len); FD_SET(client_sockfd, &readfds); } else { memset(ch, 0, 100); ioctl(fd, FIONREAD, &nread); if (nread == 0 && fd != 0) { close(fd); int j; ////finding the fd in client connection//// for (j = 1; j < 4; j++) { if (mycon[j].confd == fd) { break; } } ////terminate the connection terminate_con(mycon[j].con_id); FD_CLR(fd, &readfds); display_con(); } else { char temp1[1024]; memset(ch, 0, 1024); memset(temp1, 0, 1024); read(fd, &ch, sizeof(ch)); strcpy(temp1, ch); char *reader; reader = strtok(temp1, " "); if (reader != NULL) { if (strcmp(reader, "send") == 0) { read_table(fd, ch); memset(ch, 0, 1024); } else if (strcmp(reader, "connect") == 0) { update_conn(ch, fd); memset(ch, 0, 1024); } else if (strcmp(reader, "ERROR") == 0) { fprintf(stderr, "\n%s\n", ch); memset(ch, 0, 1024); } else if (strcmp(reader, "upload") == 0) { char filenm[256]; bzero(filenm, 256); char* tk; long long files; tk = strtok(NULL, " "); strcpy(filenm, tk); tk = strtok(NULL, " "); files = atoll(tk); int val = file_receive(fd, files, filenm); if (val == -1) fprintf(stderr, "\n\nERROR IN FILE TRANSFER\n\n"); memset(ch, 0, 1024); } else if (strcmp(reader, "terminate") == 0) { char* temp2; char ht[50]; int pt, i; temp2 = strtok(NULL, " "); strcpy(ht, temp2); temp2 = strtok(NULL, " "); pt = atoi(temp2); for (i = 1; i < 4; i++) { if (((strcmp(mycon[i].hostn, ht) == 0)) && (mycon[i].port == pt)) break; } mycon[i].con_id = -1; close(mycon[i].confd); FD_CLR(mycon[i].confd, &readfds); display_con(); memset(ch, 0, 1024); } else if (strcmp(reader, "download") == 0) { char dfile[256], conip[16]; bzero(dfile, 256); char* toknize; int dfd, port; toknize = strtok(NULL, " "); strcpy(dfile, toknize); toknize = strtok(NULL, " "); strcpy(conip, toknize); toknize = strtok(NULL, " "); port = atoi(toknize); int j; for (j = 1; j < 4; j++) { if ((strcmp(mycon[j].ip, conip) == 0) && (mycon[j].port == port)) break; } int val = file_transfer(mycon[j].confd, dfile); if (val == -1) { fprintf(stderr, "\n\nERROR IN FILE TRANSFER\n\n"); write(mycon[j].confd, "ERROR IN FILE", 30); } memset(ch, 0, 1024); } } else { memset(ch, '\0', 1024); memset(temp1, '\0', 1024); reader = NULL; } } } } } } } }