Пример #1
0
/* 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);
}
Пример #2
0
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;
	}
}
Пример #3
0
/*---------------------------------------------------------------------------------------
-- 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;

}
Пример #4
0
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) {
		;
	}	
}