Update servidor <> cliente

- Desligar todos os clientes quando o servidor desliga
- Lista ligada para gerir clientes
- listagem de cliente ligados
This commit is contained in:
José Valdiviesso 2019-11-13 22:41:19 +00:00
parent b3b8f28306
commit 17f7f30d8f
7 changed files with 168 additions and 43 deletions

BIN
client

Binary file not shown.

View File

@ -7,14 +7,15 @@
#include <sys/stat.h>
#include <time.h>
#include <ncurses.h>
//declaraao de funcoes
#include "dec.h"
#include <signal.h>
//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);
}

8
dec.h
View File

@ -1,2 +1,8 @@
void printMenu(void);
int obtem_rand(int min, int max);
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);

View File

@ -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.."

BIN
server

Binary file not shown.

127
server.c
View File

@ -7,17 +7,25 @@
#include <sys/stat.h>
#include <time.h>
#include <ncurses.h>
//declaraao de funcoes
#include "dec.h"
#include <signal.h>
//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;
}
}

7
util.h
View File

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