chat : client : connect.c - owanesh/unifi-eos GitHub Wiki

/*
 * Apre la connessione al server_pipe ed al <pid>_client_pipe, salvando i fd
 * nei riferimenti presenti in main_client.h.
 * Restituisce 1 se la connessione e' stata aperta con successo, altrimenti 0
 */
int connect() {
	/*
	 * 1) invia richiesta al server
	 * 2) se la connessione ha successo, tenta di aprire la propria pipe personale in lettura
	 */
	int isConnected = openingConnection();
	int rst = 0;
	if (isConnected) {
		//apertura del "<pid>_client_pipe"
		char pipePath[50];
		sprintf(pipePath, "./%d", getpid());
		strcat(pipePath, "_client_pipe");
		do {
			//continua ad aprire finche' non ha successo
			fdClientPipe = open(pipePath, O_RDONLY);
			sleep(1);
		} while (fdClientPipe == -1);
		//da adesso fdClientPipe sara' attiva per comunicare con il server
		rst = 1;
	} else {
		printf("Errore di connessione (probabilmente server spento).\n");
	}
	return rst;
}

Per diminuire l’influenza della richiesta “attiva” nell’apertura della pipe si utilizza una sleep(1), anche se ciò ha l’effetto di introdurre un breve ma trascurabile ritardo.

 /*
 * Apre il server_pipe e invia i propri dati per richiedere accesso.
 * Restituisce 1 se il file esiste e viene aperto, altrimenti 0
 */
int openingConnection() {
	char *serverPipePath = "./server_pipe";
	// apre server_pipe in scrittura
	fdServerPipe = open(serverPipePath, O_WRONLY);
	if (fdServerPipe == -1) {
		return 0;
	}
	//da adesso fdServerPipe sara' attiva per comunicare con il server
	char msg[50];
	//richiesta-> "CONNECT <pid>"
	sprintf(msg, "%s %d", "CONNECT", getpid());
	int msgLength = strlen(msg) + 1; //+1 per '\0'
	write(fdServerPipe, msg, msgLength);
	return 1;
}
  1. apre la pipe del server “server_pipe” in scrittura;
  2. invia il messaggio “CONNECT ” (dove indica il pid del processo) su server_pipe;
  3. il server accetta la richiesta e crea contemporaneamente la pipe personale del client “_client_pipe”;
  4. il client apre “_client_pipe” in lettura.

NOTA 1: la connessione al server_pipe viene “tentata” una sola volta, in caso la server_pipe non esista probabilmente il server non è stato lanciato e si torna al menù principale, mentre l’apertura della client_pipe viene ritentata più volte (il server potrebbe non averla ancora creata ma è questione di pochissimo tempo).

NOTA 2: le pipe nominate saranno utilizzate in pressappoco ogni contesto del programma, per facilitarne l’accesso i riferimenti fdClientPipe e fdServerPipe sono dichiarati come variabili extern nel modulo “main_client.h”.

Il server individuato a in alto a sinistra riporta le richieste di connessione di tutti e 3 i clients, in particolare riguardo la creazione delle pipe associate.

⚠️ **GitHub.com Fallback** ⚠️