From 17f7f30d8f03d9232d634e0eafcb77e9de7129b3 Mon Sep 17 00:00:00 2001 From: ZMiguel Valdiviesso Date: Wed, 13 Nov 2019 22:41:19 +0000 Subject: [PATCH] Update servidor <> cliente - Desligar todos os clientes quando o servidor desliga - Lista ligada para gerir clientes - listagem de cliente ligados --- client | Bin 17456 -> 17536 bytes client.c | 65 ++++++++++++++++++++-------- dec.h | 8 +++- makefile | 4 +- server | Bin 17408 -> 17768 bytes server.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++--------- util.h | 7 ++- 7 files changed, 168 insertions(+), 43 deletions(-) diff --git a/client b/client index 54fadff577e95369abc5438b87f422145dac4416..f7490823a6e1d1b7fb0361b6d2f80574e2df28d2 100644 GIT binary patch delta 3291 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 #include #include -//declaraao de funcoes -#include "dec.h" +#include //estructuras e outras coisas uteis #include "util.h" +//declaraao de funcoes +#include "dec.h" int main(int argc, char *argv[]){ int sair=0, test=-1; - char str[80], *palavra[10]; + char str[80], *palavra[10], *username[30]; int i; cl2sv msg2sv; @@ -30,27 +31,43 @@ int main(int argc, char *argv[]){ /* CRIAR "CP" DO CLIENTE - MINHA (mkfifo) */ sprintf(msg2sv.fifostr, "CPcliente_%d", getpid()); mkfifo(msg2sv.fifostr, 0600); //0600 READ && WRITE + msg2sv.pid = getpid(); /* ABRIR "CP" DO SERVIDOR (open - O_WRONLY) */ fd_servidor = open("CPservidor", O_WRONLY); //registar cliente no servidor - strcpy(msg2sv.cmd,"register"); - write(fd_servidor, &msg2sv, sizeof(msg2sv)); - fd_cliente = open(msg2sv.fifostr,O_RDONLY); - read(fd_cliente,&svResp,sizeof(svResp)); - close(fd_cliente); - if(svResp.code==1){ - printf("[CLIENT] Cliente registado no servidor!\n"); - }else{ - printf("[ERROR] Resposta inesperado do servdor.\n"); - /* FECHAR "CP" DO SERVIDOR (close) */ - close(fd_servidor); - /* REMOVER "cp" DO CLIENTE - EU (UNLINK) */ - unlink(msg2sv.fifostr); - exit(1); - } + do{ + printf("Nome de Utilizador: "); + //get username + fgets(username,32,stdin); + //build message to server + strcpy(msg2sv.cmd,"register"); + strcpy(msg2sv.opts,username); + //send message + write(fd_servidor, &msg2sv, sizeof(msg2sv)); + //read reply + fd_cliente = open(msg2sv.fifostr,O_RDONLY); + read(fd_cliente,&svResp,sizeof(svResp)); + close(fd_cliente); + //process reply + if(svResp.code==1){ + printf("[CLIENT] Cliente registado no servidor!\n"); + }else if(svResp.code==2){ + printf("[ERROR] Nome de Utilizador ja existente\n"); + }else{ + printf("[ERROR] Erro inesperado...\nA sair...\n"); + /* FECHAR "CP" DO SERVIDOR (close) */ + close(fd_servidor); + /* REMOVER "cp" DO CLIENTE - EU (UNLINK) */ + unlink(msg2sv.fifostr); + exit(1); + } + }while(svResp.code!=1); do{ + //sinais + signal(10,closeapp); + //cmd printf("> "); fgets(str, 80, stdin); str[strlen(str)-1]='\0'; @@ -85,6 +102,10 @@ int main(int argc, char *argv[]){ close(fd_cliente); //processar resposta printf(svResp.resp); + }else if(strcmp(palavra[0],"list")==0){ + strcpy(msg2sv.cmd, "list"); + /* ENVIAR PEDIDO PARA "CP" DO SERVIDOR (write) */ + i = write(fd_servidor, &msg2sv, sizeof(msg2sv)); } } @@ -94,4 +115,12 @@ int main(int argc, char *argv[]){ close(fd_servidor); /* REMOVER "cp" DO CLIENTE - EU (UNLINK) */ unlink(msg2sv.fifostr); +} + +void closeapp(int sig){ + char cp[32]; + sprintf(cp, "CPcliente_%d", getpid()); + printf("[CLIENT] Vou sair a pedido do SERVIDOR!\n"); + unlink(cp); + exit(0); } \ No newline at end of file diff --git a/dec.h b/dec.h index e3ffbd0..d4677fd 100644 --- a/dec.h +++ b/dec.h @@ -1,2 +1,8 @@ void printMenu(void); -int obtem_rand(int min, int max); \ No newline at end of file +int obtem_rand(int min, int max); +int verifyUserName(clients *users, int *nUsers, char *username); +clients *addUser(clients *users, int *nUsers, char *username, int pid, char *fifostr); +char *getUsernameFromfifo(clients *users, char *fifo); +void listusers(clients *users); +void closeapp(int sig); +void desligarClientes(clients *users); \ No newline at end of file diff --git a/makefile b/makefile index 0db643a..166406a 100644 --- a/makefile +++ b/makefile @@ -13,10 +13,10 @@ SRCS := $(wildcard *.c) BINS := $(SRCS:%.c=%) install: - cp ${BINS} /home/zmiguel/TP + cp ${BINS} ~/TP all: ${BINS} - cp ${BINS} /home/zmiguel/TP + cp ${BINS} ~/TP %: %.o @echo "Checking.." diff --git a/server b/server index c3b46a89334e694833189af380ea40a78b77ffcb..8624b1368efdb8ea4ae223c13e0f053f4f4e9a90 100644 GIT binary patch delta 4542 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 diff --git a/server.c b/server.c index d959ba2..d176711 100644 --- a/server.c +++ b/server.c @@ -7,17 +7,25 @@ #include #include #include -//declaraao de funcoes -#include "dec.h" +#include //estructuras e outras coisas uteis #include "util.h" +//declaraao de funcoes +#include "dec.h" + int main(int argc, char *argv[]){ int sair=0, mopt=-1, n; - + + //cliente <> server comms sv2cl msg2cl; cl2sv clResp; + //utilizadores + clients *users = NULL; + clients *uinit = users; + int userCounter = 0; + srand(time(NULL)); int fd_servidor, fd_cliente; /* VERIFICAR SE EXISTE "CP" DO SERVIDOR (access) -- APENAS UM!!!*/ @@ -38,31 +46,48 @@ int main(int argc, char *argv[]){ n = read(fd_servidor,&clResp, sizeof(clResp)); if(n == 0){ - printf("[SERVER] deu merda!\n"); + printf("[SERVER] nao da\n"); sleep(1); continue; }else if(strcmp(clResp.cmd,"DESLIGAR")==0){ printf("[SERVER] O servidor vai desligar\n"); - //implementar desligar outros clientes! + desligarClientes(users); + //TODO implementar desligar outros clientes! sair = 1; }else if(strcmp(clResp.cmd,"send")==0){ printf("funciona!\n"); printf("%s\n",clResp.opts); }else if(strcmp(clResp.cmd,"register")==0){ - msg2cl.code=1; - //responde - fd_cliente = open(clResp.fifostr,O_WRONLY); - write(fd_cliente,&msg2cl,sizeof(msg2cl)); - close(fd_cliente); - //fim resposta + clResp.opts[strlen(clResp.opts)-1]='\0'; + if(verifyUserName(users,&userCounter,clResp.opts)==1){ + msg2cl.code=2; + //responde + fd_cliente = open(clResp.fifostr,O_WRONLY); + write(fd_cliente,&msg2cl,sizeof(msg2cl)); + close(fd_cliente); + //fim resposta + }else{ + printf("[SERVER] Novo utilizador adicionado!\n"); + users = addUser(users,&userCounter,clResp.opts,clResp.pid,clResp.fifostr); + msg2cl.code=1; + //responde + fd_cliente = open(clResp.fifostr,O_WRONLY); + write(fd_cliente,&msg2cl,sizeof(msg2cl)); + close(fd_cliente); + //fim resposta + } + }else if(strcmp(clResp.cmd,"ping")==0){ - sprintf(msg2cl.resp,"[SV] Olá %s\n",clResp.fifostr); + sprintf(msg2cl.resp,"[SV] Olá %s (%s)\n",getUsernameFromfifo(users,clResp.fifostr), clResp.fifostr); printf("[SERVER] A responder ao Cliente %s",clResp.fifostr); //responde fd_cliente = open(clResp.fifostr,O_WRONLY); write(fd_cliente,&msg2cl,sizeof(msg2cl)); close(fd_cliente); //fim da resposta + }else if(strcmp(clResp.cmd,"list")==0){ + printf("[SERVER] A listar users...\n"); + listusers(users); } }while(sair==0); @@ -76,16 +101,78 @@ int main(int argc, char *argv[]){ exit(0); } -void printMenu(void){ - printf("[SERVER] Menu:\n"); - printf("\t1 - coisas\n"); - printf("\t0 - SAIR\n"); - - printf("> "); -} - int obtem_rand(int min, int max){ int random; random = min + (rand() % (max - min + 1)); return random; +} + +int verifyUserName(clients *users, int *nUsers, char *username){ + clients *uinit = users; + while(users!=NULL){ + if(strcmp(users->nome,username)==0){ + users = uinit; + return 1; + }else{ + users=users->prox; + } + } + users = uinit; + return 0; +} + +clients *addUser(clients *users, int *nUsers, char *username, int pid, char *fifostr){ + *nUsers++; + clients *uinit = users; + if(users == NULL){//adicionar primeiro user + users = malloc(sizeof(clients)); + strcpy(users->nome,username); + strcpy(users->fifostr,fifostr); + users->pid=pid; + users->prox = NULL; + uinit = users; + }else{//adicionar outros users + while(users->prox!=NULL){ + users=users->prox; + } + users->prox = malloc(sizeof(clients)); + users = users->prox; + strcpy(users->nome,username); + strcpy(users->fifostr,fifostr); + users->pid=pid; + users->prox = NULL; + users = uinit; + } + return users; +} + +char *getUsernameFromfifo(clients *users, char *fifo){ + clients *uinit = users; + char send[100]; + while(users!=NULL){ + if(strcmp(users->fifostr,fifo)==0){ + strcpy(send,users->nome); + users = uinit; + return send; + } + users=users->prox; + } + strcpy(send,"-ERROR"); + return send; +} + +void listusers(clients *users){ + clients *uinit = users; + while(users!=NULL){ + printf("Nome: %s, Fifo: %s\n",users->nome,users->fifostr); + users=users->prox; + } + users = uinit; +} + +void desligarClientes(clients *users){ + while(users!=NULL){ + kill(users->pid,10); + users=users->prox; + } } \ No newline at end of file diff --git a/util.h b/util.h index 43aaad8..99e4e25 100644 --- a/util.h +++ b/util.h @@ -1,6 +1,7 @@ #define TAM_TITULO 128 #define TAM_CORPO 1001 #define TAM_NOME 100 +#define TAM_SUB 32 //maximo nr de topics subscritos por utilizador //tamanhos comunicacao cl<>sv #define TAM_CMD 64 #define TAM_OPTS 128 @@ -28,6 +29,9 @@ typedef struct{ int pid; char nome[TAM_NOME]; char fifostr[TAM_NOME]; + int topics[TAM_SUB]; + + struct clients *prox; }clients; //estructura dados de cliente --> servidor @@ -48,8 +52,7 @@ typedef struct{ }cl2sv; //estructura de dados servidor --> cliente -typedef struct -{ +typedef struct{ int code; char type[TAM_CMD]; char resp[TAM_RESP];