Skip to content
This repository was archived by the owner on Nov 4, 2023. It is now read-only.

chat : client : getListOfClient.c

sᴀʟᴠᴀᴛᴏʀᴇ ʙ edited this page Jul 23, 2017 · 2 revisions
void getListOfClients() {
	/*
	 * 1) Invia richiesta al server
	 * 2) Alloca lo spazio per salvare la lista
	 * 3) Legge un carattere alla volta da fdClientPipe
	 * 4) se necessario rialloca più spazio
	 * 5) stampa la lista su stdout
	 * 6) libera lo spazio occupato
	 */
	//dimensione iniziale della lista, se si rivelera' insufficiente verra' riallocata
	int dim = 64;
	sendRequestToServer();
	char *list = malloc(sizeof(char) * dim);
	char* start;
	if (list != NULL) {
		start = list;
		int n, count = 0;
		do { // Legge fino a '\0' o EOF
			n = read(fdClientPipe, list, 1);
			if (n != 0) {
				count++;
				if (count == dim) {
					//rialloco il doppio della dimensione precedente
					list = realloc(list, sizeof(char) * (dim * 2));
					start = list;
					dim *= 2;
					list += (count - 1); //riposiziono il puntatore
				}
			}
		} while (n > 0 && *list++ != '\0');
		printf("%s", start);
		free(start);
	}
}
/*
 * Invia il messaggio "LIST <pid>".
 */
void sendRequestToServer() {
	char msg[50];
	//richiesta-> "LIST <pid>"
	sprintf(msg, "%s %d", "LIST", getpid());
	int msgLength = strlen(msg) + 1; //+1 per '\0'
	write(fdServerPipe, msg, msgLength);
}
  1. invia un richiesta al server attraverso il messaggio “LIST ” ( = pid del mittente) fornito dalla funzione sendRequestToServer();
  2. attende la risposta eseguendo una read bloccante;
  3. legge un carattere alla volta salvando la stringa in una variabile apposita, non essendo nota la lunghezza del messaggio ricevuto vengono inizialmente istanziati 50 caratteri, che se si rivelano insufficienti vengono riallocati;
  4. stampa la lista dei client su schermo (già opportunamente formattata dal server, perciò si stampa esattamente ciò che è stato letto).

Clone this wiki locally