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:
parent
b3b8f28306
commit
17f7f30d8f
65
client.c
65
client.c
|
@ -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
8
dec.h
|
@ -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);
|
4
makefile
4
makefile
|
@ -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.."
|
||||||
|
|
127
server.c
127
server.c
|
@ -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
7
util.h
|
@ -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];
|
||||||
|
|
Loading…
Reference in New Issue