comunicação entre servidor e vários clientes

This commit is contained in:
zmiguel.alves@gmail.com 2019-11-13 19:03:13 +00:00
parent d12476b298
commit b3b8f28306
5 changed files with 115 additions and 27 deletions

BIN
client

Binary file not shown.

View File

@ -17,21 +17,39 @@ int main(int argc, char *argv[]){
char str[80], *palavra[10]; char str[80], *palavra[10];
int i; int i;
msg mensagem; cl2sv msg2sv;
sv2cl svResp;
int fd_servidor, fd_cliente; int fd_servidor, fd_cliente;
/* VERIFICAR SE EXISTE "CP" NO SERVIDOR(access) */ /* VERIFICAR SE EXISTE "CP" NO SERVIDOR(access) */
if(access("CPservidor", F_OK)!=0){ if(access("CPservidor", F_OK)!=0){
printf("[ERRO] O servidor nao esta em execucao!\n"); printf("[ERROR] O servidor nao esta em execucao!\n");
exit(1); exit(1);
}; };
/* CRIAR "CP" DO CLIENTE - MINHA (mkfifo) */ /* CRIAR "CP" DO CLIENTE - MINHA (mkfifo) */
sprintf(mensagem.addrss, "CPcliente_%d", getpid()); sprintf(msg2sv.fifostr, "CPcliente_%d", getpid());
mkfifo(mensagem.addrss, 0600); //0600 READ && WRITE mkfifo(msg2sv.fifostr, 0600); //0600 READ && WRITE
/* 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
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{ do{
printf("> "); printf("> ");
fgets(str, 80, stdin); fgets(str, 80, stdin);
@ -43,18 +61,37 @@ int main(int argc, char *argv[]){
palavra[i] = strtok(NULL," "); palavra[i] = strtok(NULL," ");
} }
if(palavra[0]!=NULL){ if(palavra[0]!=NULL){
if(strcmp(palavra[0],"send")==0){ if(strcmp(palavra[0],"sair")==0){
strcpy(mensagem.titulo, "send"); printf("[CLIENT] A sair!\n");
strcpy(mensagem.corpo, palavra[1]); sair = 1;
}else if(strcmp(palavra[0],"send")==0){
strcpy(msg2sv.cmd, "send");
strcpy(msg2sv.opts, palavra[1]);
/* ENVIAR PEDIDO PARA "CP" DO SERVIDOR (write) */ /* ENVIAR PEDIDO PARA "CP" DO SERVIDOR (write) */
i = write(fd_servidor, &mensagem, sizeof(mensagem)); i = write(fd_servidor, &msg2sv, sizeof(msg2sv));
}else if(strcmp(palavra[0],"desligar")==0){
printf("[CLIENT] A Desligar servidor!\n");
strcpy(msg2sv.cmd, "DESLIGAR");
write(fd_servidor, &msg2sv, sizeof(msg2sv));
printf("[CLIENT] A sair!\n");
sair = 1;
}else if(strcmp(palavra[0],"ping")==0){
strcpy(msg2sv.cmd, "ping");
/* ENVIAR PEDIDO PARA "CP" DO SERVIDOR (write) */
i = write(fd_servidor, &msg2sv, sizeof(msg2sv));
//ler resposta do servidor
fd_cliente = open(msg2sv.fifostr,O_RDONLY);
read(fd_cliente,&svResp,sizeof(svResp));
close(fd_cliente);
//processar resposta
printf(svResp.resp);
} }
} }
}while(true); }while(sair==0);
/* FECHAR "CP" DO SERVIDOR (close) */ /* FECHAR "CP" DO SERVIDOR (close) */
close(fd_servidor); close(fd_servidor);
/* REMOVER "cp" DO CLIENTE - EU (UNLINK) */ /* REMOVER "cp" DO CLIENTE - EU (UNLINK) */
unlink(mensagem.addrss); unlink(msg2sv.fifostr);
} }

BIN
server

Binary file not shown.

View File

@ -15,10 +15,11 @@
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){
int sair=0, mopt=-1, n; int sair=0, mopt=-1, n;
msg mensagem; sv2cl msg2cl;
cl2sv clResp;
srand(time(NULL)); srand(time(NULL));
int fd_servidor; int fd_servidor, fd_cliente;
/* VERIFICAR SE EXISTE "CP" DO SERVIDOR (access) -- APENAS UM!!!*/ /* VERIFICAR SE EXISTE "CP" DO SERVIDOR (access) -- APENAS UM!!!*/
if(access("CPservidor", F_OK)==0){ if(access("CPservidor", F_OK)==0){
printf("[SERVIDOR] Ja existe um servidor!\n"); printf("[SERVIDOR] Ja existe um servidor!\n");
@ -34,18 +35,37 @@ int main(int argc, char *argv[]){
/* Fazer coisas aqui! */ /* Fazer coisas aqui! */
do{ do{
n = read(fd_servidor,&mensagem, sizeof(mensagem)); n = read(fd_servidor,&clResp, sizeof(clResp));
if(n == 0){ if(n == 0){
printf("[SERVER] deu merda!\n"); printf("[SERVER] deu merda!\n");
sleep(1); sleep(1);
continue; continue;
}else if(strcmp(mensagem.titulo,"send")==0){ }else if(strcmp(clResp.cmd,"DESLIGAR")==0){
printf("[SERVER] O servidor vai desligar\n");
//implementar desligar outros clientes!
sair = 1;
}else if(strcmp(clResp.cmd,"send")==0){
printf("funciona!\n"); printf("funciona!\n");
printf("%s\n",mensagem.corpo); 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
}else if(strcmp(clResp.cmd,"ping")==0){
sprintf(msg2cl.resp,"[SV] Olá %s\n",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
} }
}while(true); }while(sair==0);
printf("[SERVER] SERVIDOR DESLIGADO\n"); printf("[SERVER] SERVIDOR DESLIGADO\n");

53
util.h
View File

@ -1,25 +1,56 @@
#define TAM_TITULO 128 #define TAM_TITULO 128
#define TAM_CORPO 1001 #define TAM_CORPO 1001
#define TAM_NOME 100 #define TAM_NOME 100
//tamanhos comunicacao cl<>sv
#define TAM_CMD 64
#define TAM_OPTS 128
#define TAM_RESP 512
typedef struct msgdef typedef struct{
{
int id; int id;
char titulo[TAM_TITULO]; char titulo[TAM_TITULO];
char corpo[TAM_CORPO]; char corpo[TAM_CORPO];
int duracao; int duracao;
int time_added; int time_added;
char addrss[20]; struct topic * topico;
struct mensagem * prox;
}mensagem;
struct topicdef * topico; typedef struct{
struct msgdef * prox;
}msg;
typedef struct topicdef
{
int id; int id;
char nome[TAM_NOME]; char nome[TAM_NOME];
struct msgdef * mensg; struct mensagem * mensg;
struct topicdef * prox; struct topic * prox;
}topic; }topic;
//guardar clientes
typedef struct{
int pid;
char nome[TAM_NOME];
char fifostr[TAM_NOME];
}clients;
//estructura dados de cliente --> servidor
struct clmsg{
char titulo[TAM_TITULO];
char corpo[TAM_CORPO];
int duracao;
};
typedef struct{
char fifostr[TAM_NOME];
//base
int pid;
char cmd[TAM_CMD];
char opts[TAM_OPTS];
int nopt;
//mensagem
struct clmsg msg;
}cl2sv;
//estructura de dados servidor --> cliente
typedef struct
{
int code;
char type[TAM_CMD];
char resp[TAM_RESP];
}sv2cl;