remover cliente da lista quando ele sai

This commit is contained in:
zmiguel.alves@gmail.com 2019-11-13 23:42:50 +00:00
parent 17f7f30d8f
commit ab40e8652d
7 changed files with 44 additions and 9 deletions

BIN
client

Binary file not shown.

View File

@ -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;

3
dec.h
View File

@ -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);
void desligarClientes(clients *users);
clients *removeUser(clients *users, char *cp, int *nUsers);

View File

@ -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}

BIN
server

Binary file not shown.

View File

@ -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;
}

Binary file not shown.