comunicação entre servidor e vários clientes
This commit is contained in:
parent
d12476b298
commit
b3b8f28306
57
client.c
57
client.c
|
@ -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);
|
||||||
}
|
}
|
32
server.c
32
server.c
|
@ -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
53
util.h
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue