/* validation de la connexion d'un utilisateur */ void bienvenue(char *name, int sock_com){ char buffer[MAX_SIZE]; client_list *tmp; pthread_mutex_lock(&mutex_clients); if(client_exists(clients, name)){ /* si le nom du joueur est déjà pris */ sprintf(buffer, "%s already used\n", name); write(sock_com, buffer, strlen(buffer)); pthread_mutex_unlock(&mutex_clients); }else{ /* ajout dans la file d'attente tant que le client n'est pas nommé */ pthread_mutex_lock(&mutex_attente); file_attente = add_name_client(file_attente, sock_com, name); if(get_phase() == -1){ /* transfert du client dans la file d'attente vers la liste des clients */ tmp = get_client(file_attente, name); file_attente = suppr_client(file_attente, name); tmp->next = clients; clients = tmp; } sprintf(buffer, "BIENVENUE/%s/\n", name); write(sock_com, buffer, strlen(buffer)); pthread_mutex_unlock(&mutex_clients); pthread_mutex_unlock(&mutex_attente); /* Notification à tous les clients de la connexion de ce joueur */ connecte(name); } pthread_mutex_unlock(&mutex_clients); }
int get_client_id(char *name) { if( !client_exists(name) ) return -1; for(int i = 0; i < known_clients.size(); ++i) { if( strcmp(known_clients[i].basic_info.name, name) == 0) return i; } }
/*--------------------------------------------------------------------------------------- -- FUNCTION: get_stats -- -- DATE: February 11, 2016 -- -- DESIGNERS: Rizwan Ahmed, Vishav Singh -- -- PROGRAMMERS: Rizwan Ahmed, Vishav Singh -- -- PARAMETERS: -- char * ipAddress - the IP address of the client stats to get -- -- RETURNS: Pointer to client statistics data struct array. -- -- NOTES: Looks for the pointer to the struct that holds the IP address and -- returns it if the client exists or creates a new struct and returns that instead. ---------------------------------------------------------------------------------------*/ ClntStats * get_stats(char * ipAddress) { int c; if ((c = client_exists(ipAddress)) != -1) { return &srvr_stats[c]; } else { if ((srvr_stats = (ClntStats*)realloc(srvr_stats, sizeof (ClntStats) * (srvrStats_len + 1))) != NULL) { srvrStats_len++; //Initialize server_stats memset(srvr_stats[srvrStats_len - 1].address, 0, 32); // Copy address to struct strcpy(srvr_stats[srvrStats_len - 1].address, ipAddress); srvr_stats[srvrStats_len - 1].total_connect = 0; srvr_stats[srvrStats_len - 1].curr_connect = 0; srvr_stats[srvrStats_len - 1].total_message = 0; srvr_stats[srvrStats_len - 1].message = 0; srvr_stats[srvrStats_len - 1].total_data = 0; srvr_stats[srvrStats_len - 1].curr_data = 0; return &srvr_stats[srvrStats_len - 1]; } } return NULL; }
int digest_user_comand(char *msg) { cmd_t cmd = extract_command(msg); char buf[sizeof(info_clients)]; /* Eventuale argumente ale comenzilor */ char arg1[NAME_LEN]; char arg2[NAME_LEN]; memset(arg1, '\0', NAME_LEN); memset(arg2, '\0', NAME_LEN); if(cmd == infoclients) { int x = send(sockfd, msg, strlen(msg), 0); memset(buf, '\0', sizeof(info_clients)); x = recv(sockfd, buf, sizeof(info_clients), 0); struct info_clients *X = (struct info_clients *)buf; log_file << client_name << "> infoclients\n"; for(int i = 0; i < X->nr; ++i) { log_file << X->clients[i].name << " " << X->clients[i].IP << " " << X->clients[i].port << "\n"; std::cout << X->clients[i].name << " " << X->clients[i].IP << " " << X->clients[i].port << "\n"; if( !client_exists(X->clients[i].name) ) { struct known_client new_client; memset(new_client.basic_info.name, '\0', NAME_LEN); sprintf(new_client.basic_info.name, "%s", X->clients[i].name); memset(new_client.basic_info.IP, '\0', NAME_LEN); sprintf(new_client.basic_info.IP, "%s", X->clients[i].IP); new_client.basic_info.port = X->clients[i].port; new_client.nr_of_shared_files = 0; known_clients.push_back(new_client); } } memset(buf, '\0', sizeof(info_clients)); std::cout << "\n"; } if(cmd == share) { extract_arguments(arg1, arg2, msg); log_file << client_name << "> " << msg << "\n"; FILE *f = fopen(arg1, "r"); if( f == NULL ) { std::cout << ABSENT_FILE << " : Fisier inexistent\n"; log_file << ABSENT_FILE << " : Fisier inexistent\n"; return 1; } fclose(f); if(nr_of_shared_files >= 32) { std::cout << "At depasit numarul maxim de fisiere ce pot fi partajate\n"; return 0; } /* Punem in arg 2 dimensiunea fisierului */ struct stat info; lstat(arg1, &info); memset(arg2, '\0', NAME_LEN); human_readable((double)info.st_size, arg2); bool is_new_file = true; for(int i = 0; i < nr_of_shared_files; ++i) { if( strcmp(arg1, shared[i].name) == 0 ) { memset(shared[i].size, '\0', NAME_LEN); sprintf(shared[i].size, "%s", arg2); is_new_file = false; break; } } if( is_new_file ) { memset(shared[nr_of_shared_files].name, '\0', NAME_LEN); memset(shared[nr_of_shared_files].size, '\0', NAME_LEN); sprintf(shared[nr_of_shared_files].name, "%s", arg1); sprintf(shared[nr_of_shared_files].size, "%s", arg2); nr_of_shared_files++; } memset(msg, '\0', BUFLEN); strcat(msg, "share "); strcat(msg, arg1); strcat(msg, " "); strcat(msg, arg2); int x = send(sockfd, msg, BUFLEN, 0); memset(arg2, '\0', NAME_LEN); recv(sockfd, arg2, NAME_LEN, 0); std::cout << arg2 << "\n\n"; log_file << arg2 << "\n"; } if( cmd == unshare_file ) { extract_arguments(arg1, arg2, msg); std::cout << client_name << "> unshare " << arg1 << "\n"; log_file << client_name << "> unshare " << arg1 << "\n"; int id = -1; for(int i = 0; i < nr_of_shared_files; ++i) { if( strcmp(shared[i].name, arg1) == 0 ) { id = i; break; } } if( id == -1 ) { std::cout << "-5 : Fisier inexistent\n"; log_file << "-5 : Fisier inexistent\n"; return 0; } for(int i = id + 1; i < nr_of_shared_files; ++i) { /* shared[i - 1] <- shared[i] */ memset(shared[i - 1].name, '\0', NAME_LEN); sprintf(shared[i - 1].name, "%s", shared[i].name); memset(shared[i - 1].size, '\0', NAME_LEN); sprintf(shared[i - 1].size, "%s", shared[i].size); } nr_of_shared_files--; send(sockfd, msg, strlen(msg), 0); log_file << "Succes\n"; std::cout << "Succes\n\n"; } if( cmd == getshare ) { extract_arguments(arg1, arg2, msg); std::cout << client_name << "> " << msg << "\n"; log_file << client_name << "> " << msg << "\n"; send(sockfd, msg, strlen(msg), 0); memset(buf, '\0', NAME_LEN); recv(sockfd, buf, NAME_LEN, 0); int status; sscanf(buf, "%d", &status); if(status == ABSENT_CLIENT) { std::cout << ABSENT_CLIENT << " : Client inexistent\n"; log_file << ABSENT_CLIENT << " : Client inexistent\n"; return 1; } memset(buf, '\0', NAME_LEN); recv(sockfd, buf, NAME_LEN, 0); int nr; sscanf(buf, "%d", &nr); int id = -1; for(int i = 0; i < known_clients.size(); ++i) { if( strcmp(known_clients[i].basic_info.name, arg1) == 0) id = i; } if( id != -1) known_clients[id].nr_of_shared_files = nr; log_file << nr << "\n"; char buf1[sizeof(struct client) * MAX_FILES]; memset(buf1, '\0', sizeof(struct client) * MAX_FILES); recv(sockfd, buf1, sizeof(struct client) * MAX_FILES, 0); struct client *X = (struct client *)buf1; for(int i = 0; i < nr; ++i) { std::cout << X->shared[i].name << " " << X->shared[i].size << "\n"; log_file << X->shared[i].name << " " << X->shared[i].size << "\n"; if( id != -1 ) { memset(known_clients[id].shared[i].name, '\0', NAME_LEN); sprintf(known_clients[id].shared[i].name, "%s", X->shared[i].name); memset(known_clients[id].shared[i].size, '\0', NAME_LEN); sprintf(known_clients[id].shared[i].size, "%s", X->shared[i].size); } } } if(cmd == history) { std::cout << client_name << "> history \n"; log_file << client_name << "> history \n"; if( age == 0 ) return 0; std::cout << age << "\n"; log_file << age << "\n"; for(int i = 0; i < age; i++) { std::cout << H[i] << "\n"; log_file << H[i] << "\n"; } } if(cmd == NOP) { ; } }