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 <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
8
dec.h
|
@ -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);
|
4
makefile
4
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.."
|
||||
|
|
127
server.c
127
server.c
|
@ -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
7
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];
|
||||
|
|
Loading…
Reference in New Issue