-
Notifications
You must be signed in to change notification settings - Fork 0
chat : client : connect.c
/*
* 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;
}- apre la pipe del server “server_pipe” in scrittura;
- invia il messaggio “CONNECT ” (dove indica il pid del processo) su server_pipe;
- il server accetta la richiesta e crea contemporaneamente la pipe personale del client “_client_pipe”;
- 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.
Made with ❤️ by Owanesh and MatteoMauro | MIT ©