diff --git a/client b/client index 54fadff..f749082 100644 Binary files a/client and b/client differ diff --git a/client.c b/client.c index 4359760..3da2df2 100644 --- a/client.c +++ b/client.c @@ -7,14 +7,15 @@ #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, 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 c3b46a8..8624b13 100644 Binary files a/server and b/server differ 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];