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 <sys/stat.h>
#include <time.h> #include <time.h>
#include <ncurses.h> #include <ncurses.h>
//declaraao de funcoes #include <signal.h>
#include "dec.h"
//estructuras e outras coisas uteis //estructuras e outras coisas uteis
#include "util.h" #include "util.h"
//declaraao de funcoes
#include "dec.h"
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){
int sair=0, test=-1; int sair=0, test=-1;
char str[80], *palavra[10]; char str[80], *palavra[10], *username[30];
int i; int i;
cl2sv msg2sv; cl2sv msg2sv;
@ -30,27 +31,43 @@ int main(int argc, char *argv[]){
/* CRIAR "CP" DO CLIENTE - MINHA (mkfifo) */ /* CRIAR "CP" DO CLIENTE - MINHA (mkfifo) */
sprintf(msg2sv.fifostr, "CPcliente_%d", getpid()); sprintf(msg2sv.fifostr, "CPcliente_%d", getpid());
mkfifo(msg2sv.fifostr, 0600); //0600 READ && WRITE mkfifo(msg2sv.fifostr, 0600); //0600 READ && WRITE
msg2sv.pid = getpid();
/* ABRIR "CP" DO SERVIDOR (open - O_WRONLY) */ /* ABRIR "CP" DO SERVIDOR (open - O_WRONLY) */
fd_servidor = open("CPservidor", O_WRONLY); fd_servidor = open("CPservidor", O_WRONLY);
//registar cliente no servidor //registar cliente no servidor
strcpy(msg2sv.cmd,"register"); do{
write(fd_servidor, &msg2sv, sizeof(msg2sv)); printf("Nome de Utilizador: ");
fd_cliente = open(msg2sv.fifostr,O_RDONLY); //get username
read(fd_cliente,&svResp,sizeof(svResp)); fgets(username,32,stdin);
close(fd_cliente); //build message to server
if(svResp.code==1){ strcpy(msg2sv.cmd,"register");
printf("[CLIENT] Cliente registado no servidor!\n"); strcpy(msg2sv.opts,username);
}else{ //send message
printf("[ERROR] Resposta inesperado do servdor.\n"); write(fd_servidor, &msg2sv, sizeof(msg2sv));
/* FECHAR "CP" DO SERVIDOR (close) */ //read reply
close(fd_servidor); fd_cliente = open(msg2sv.fifostr,O_RDONLY);
/* REMOVER "cp" DO CLIENTE - EU (UNLINK) */ read(fd_cliente,&svResp,sizeof(svResp));
unlink(msg2sv.fifostr); close(fd_cliente);
exit(1); //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{ do{
//sinais
signal(10,closeapp);
//cmd
printf("> "); printf("> ");
fgets(str, 80, stdin); fgets(str, 80, stdin);
str[strlen(str)-1]='\0'; str[strlen(str)-1]='\0';
@ -85,6 +102,10 @@ int main(int argc, char *argv[]){
close(fd_cliente); close(fd_cliente);
//processar resposta //processar resposta
printf(svResp.resp); 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); close(fd_servidor);
/* REMOVER "cp" DO CLIENTE - EU (UNLINK) */ /* REMOVER "cp" DO CLIENTE - EU (UNLINK) */
unlink(msg2sv.fifostr); 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); 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=%) BINS := $(SRCS:%.c=%)
install: install:
cp ${BINS} /home/zmiguel/TP cp ${BINS} ~/TP
all: ${BINS} all: ${BINS}
cp ${BINS} /home/zmiguel/TP cp ${BINS} ~/TP
%: %.o %: %.o
@echo "Checking.." @echo "Checking.."

BIN
server

Binary file not shown.

127
server.c
View File

@ -7,17 +7,25 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <time.h> #include <time.h>
#include <ncurses.h> #include <ncurses.h>
//declaraao de funcoes #include <signal.h>
#include "dec.h"
//estructuras e outras coisas uteis //estructuras e outras coisas uteis
#include "util.h" #include "util.h"
//declaraao de funcoes
#include "dec.h"
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){
int sair=0, mopt=-1, n; int sair=0, mopt=-1, n;
//cliente <> server comms
sv2cl msg2cl; sv2cl msg2cl;
cl2sv clResp; cl2sv clResp;
//utilizadores
clients *users = NULL;
clients *uinit = users;
int userCounter = 0;
srand(time(NULL)); srand(time(NULL));
int fd_servidor, fd_cliente; int fd_servidor, fd_cliente;
/* VERIFICAR SE EXISTE "CP" DO SERVIDOR (access) -- APENAS UM!!!*/ /* 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)); n = read(fd_servidor,&clResp, sizeof(clResp));
if(n == 0){ if(n == 0){
printf("[SERVER] deu merda!\n"); printf("[SERVER] nao da\n");
sleep(1); sleep(1);
continue; continue;
}else if(strcmp(clResp.cmd,"DESLIGAR")==0){ }else if(strcmp(clResp.cmd,"DESLIGAR")==0){
printf("[SERVER] O servidor vai desligar\n"); printf("[SERVER] O servidor vai desligar\n");
//implementar desligar outros clientes! desligarClientes(users);
//TODO implementar desligar outros clientes!
sair = 1; sair = 1;
}else if(strcmp(clResp.cmd,"send")==0){ }else if(strcmp(clResp.cmd,"send")==0){
printf("funciona!\n"); printf("funciona!\n");
printf("%s\n",clResp.opts); printf("%s\n",clResp.opts);
}else if(strcmp(clResp.cmd,"register")==0){ }else if(strcmp(clResp.cmd,"register")==0){
msg2cl.code=1; clResp.opts[strlen(clResp.opts)-1]='\0';
//responde if(verifyUserName(users,&userCounter,clResp.opts)==1){
fd_cliente = open(clResp.fifostr,O_WRONLY); msg2cl.code=2;
write(fd_cliente,&msg2cl,sizeof(msg2cl)); //responde
close(fd_cliente); fd_cliente = open(clResp.fifostr,O_WRONLY);
//fim resposta 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){ }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); printf("[SERVER] A responder ao Cliente %s",clResp.fifostr);
//responde //responde
fd_cliente = open(clResp.fifostr,O_WRONLY); fd_cliente = open(clResp.fifostr,O_WRONLY);
write(fd_cliente,&msg2cl,sizeof(msg2cl)); write(fd_cliente,&msg2cl,sizeof(msg2cl));
close(fd_cliente); close(fd_cliente);
//fim da resposta //fim da resposta
}else if(strcmp(clResp.cmd,"list")==0){
printf("[SERVER] A listar users...\n");
listusers(users);
} }
}while(sair==0); }while(sair==0);
@ -76,16 +101,78 @@ int main(int argc, char *argv[]){
exit(0); 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 obtem_rand(int min, int max){
int random; int random;
random = min + (rand() % (max - min + 1)); random = min + (rand() % (max - min + 1));
return random; 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_TITULO 128
#define TAM_CORPO 1001 #define TAM_CORPO 1001
#define TAM_NOME 100 #define TAM_NOME 100
#define TAM_SUB 32 //maximo nr de topics subscritos por utilizador
//tamanhos comunicacao cl<>sv //tamanhos comunicacao cl<>sv
#define TAM_CMD 64 #define TAM_CMD 64
#define TAM_OPTS 128 #define TAM_OPTS 128
@ -28,6 +29,9 @@ typedef struct{
int pid; int pid;
char nome[TAM_NOME]; char nome[TAM_NOME];
char fifostr[TAM_NOME]; char fifostr[TAM_NOME];
int topics[TAM_SUB];
struct clients *prox;
}clients; }clients;
//estructura dados de cliente --> servidor //estructura dados de cliente --> servidor
@ -48,8 +52,7 @@ typedef struct{
}cl2sv; }cl2sv;
//estructura de dados servidor --> cliente //estructura de dados servidor --> cliente
typedef struct typedef struct{
{
int code; int code;
char type[TAM_CMD]; char type[TAM_CMD];
char resp[TAM_RESP]; char resp[TAM_RESP];