From ab40e8652d5bc85c8ef61b17f4e647ad0b6037ae Mon Sep 17 00:00:00 2001 From: "zmiguel.alves@gmail.com" Date: Wed, 13 Nov 2019 23:42:50 +0000 Subject: [PATCH] remover cliente da lista quando ele sai --- client | Bin 17536 -> 0 bytes client.c | 7 +++++-- dec.h | 3 ++- makefile | 9 ++++++--- server | Bin 17768 -> 0 bytes server.c | 34 +++++++++++++++++++++++++++++++--- verificador | Bin 17328 -> 0 bytes 7 files changed, 44 insertions(+), 9 deletions(-) delete mode 100644 client delete mode 100644 server delete mode 100644 verificador diff --git a/client b/client deleted file mode 100644 index f7490823a6e1d1b7fb0361b6d2f80574e2df28d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17536 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 diff --git a/client.c b/client.c index 3da2df2..10b42b6 100644 --- a/client.c +++ b/client.c @@ -79,6 +79,9 @@ int main(int argc, char *argv[]){ } if(palavra[0]!=NULL){ if(strcmp(palavra[0],"sair")==0){ + printf("[CLIENT] Avisar servidor para me remover\n"); + strcpy(msg2sv.cmd, "leaving"); + write(fd_servidor, &msg2sv, sizeof(msg2sv)); printf("[CLIENT] A sair!\n"); sair = 1; }else if(strcmp(palavra[0],"send")==0){ @@ -86,9 +89,9 @@ int main(int argc, char *argv[]){ strcpy(msg2sv.opts, palavra[1]); /* ENVIAR PEDIDO PARA "CP" DO SERVIDOR (write) */ i = write(fd_servidor, &msg2sv, sizeof(msg2sv)); - }else if(strcmp(palavra[0],"desligar")==0){ + }else if(strcmp(palavra[0],"shutdown")==0){ printf("[CLIENT] A Desligar servidor!\n"); - strcpy(msg2sv.cmd, "DESLIGAR"); + strcpy(msg2sv.cmd, "shutdown"); write(fd_servidor, &msg2sv, sizeof(msg2sv)); printf("[CLIENT] A sair!\n"); sair = 1; diff --git a/dec.h b/dec.h index d4677fd..7e2982d 100644 --- a/dec.h +++ b/dec.h @@ -5,4 +5,5 @@ clients *addUser(clients *users, int *nUsers, char *username, int pid, char *fif char *getUsernameFromfifo(clients *users, char *fifo); void listusers(clients *users); void closeapp(int sig); -void desligarClientes(clients *users); \ No newline at end of file +void desligarClientes(clients *users); +clients *removeUser(clients *users, char *cp, int *nUsers); \ No newline at end of file diff --git a/makefile b/makefile index 166406a..1b88048 100644 --- a/makefile +++ b/makefile @@ -12,9 +12,6 @@ LINKERFLAG = -lm SRCS := $(wildcard *.c) BINS := $(SRCS:%.c=%) -install: - cp ${BINS} ~/TP - all: ${BINS} cp ${BINS} ~/TP @@ -26,6 +23,12 @@ all: ${BINS} @echo "Creating object.." ${CC} -c $< +cliente: client.o + +gestor: server.o + +verificador: verificador.o + clean: @echo "Cleaning up..." rm -rvf *.o ${BINS} diff --git a/server b/server deleted file mode 100644 index 8624b1368efdb8ea4ae223c13e0f053f4f4e9a90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17768 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 diff --git a/server.c b/server.c index d176711..57405ca 100644 --- a/server.c +++ b/server.c @@ -49,7 +49,7 @@ int main(int argc, char *argv[]){ printf("[SERVER] nao da\n"); sleep(1); continue; - }else if(strcmp(clResp.cmd,"DESLIGAR")==0){ + }else if(strcmp(clResp.cmd,"shutdown")==0){ printf("[SERVER] O servidor vai desligar\n"); desligarClientes(users); //TODO implementar desligar outros clientes! @@ -86,8 +86,13 @@ int main(int argc, char *argv[]){ close(fd_cliente); //fim da resposta }else if(strcmp(clResp.cmd,"list")==0){ - printf("[SERVER] A listar users...\n"); + printf("[SERVER] A listar %d clientes...\n",userCounter); listusers(users); + }else if(strcmp(clResp.cmd,"leaving")==0){ + printf("[SERVER] Cliente desligado...\n"); + users=removeUser(users,clResp.fifostr,&userCounter); + printf("[SERVER] Cliente removido!\n"); + uinit = users; } }while(sair==0); @@ -122,7 +127,7 @@ int verifyUserName(clients *users, int *nUsers, char *username){ } clients *addUser(clients *users, int *nUsers, char *username, int pid, char *fifostr){ - *nUsers++; + (*nUsers)++; clients *uinit = users; if(users == NULL){//adicionar primeiro user users = malloc(sizeof(clients)); @@ -175,4 +180,27 @@ void desligarClientes(clients *users){ kill(users->pid,10); users=users->prox; } +} + +clients *removeUser(clients *users, char *cp, int *nUsers){ + (*nUsers)--; + clients *uinit = users; + clients *prev; + //verificar se o user que saiu foi o 1. na lista + if(strcmp(users->fifostr,cp)==0){ + //é o primeiro do lista + uinit=users->prox; + free(users); + }else{ + //nao é o primeiro da lista + while(users!=NULL){ + prev = users; + users = users->prox; + if(strcmp(users->fifostr,cp)==0){ + prev->prox = users->prox; + break; + } + } + } + return uinit; } \ No newline at end of file diff --git a/verificador b/verificador deleted file mode 100644 index f5b68c70779cdef78a007d60b4bea465c93bb482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17328 zcmeHOdvH|M89$o^2?(2jpb@led01%85XpMrp@k96NQe9j�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