diff --git a/client b/client index cdc5d83..54fadff 100644 Binary files a/client and b/client differ diff --git a/client.c b/client.c index e39bc62..4359760 100644 --- a/client.c +++ b/client.c @@ -17,21 +17,39 @@ int main(int argc, char *argv[]){ char str[80], *palavra[10]; int i; - msg mensagem; + cl2sv msg2sv; + sv2cl svResp; int fd_servidor, fd_cliente; /* VERIFICAR SE EXISTE "CP" NO SERVIDOR(access) */ 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); }; /* CRIAR "CP" DO CLIENTE - MINHA (mkfifo) */ - sprintf(mensagem.addrss, "CPcliente_%d", getpid()); - mkfifo(mensagem.addrss, 0600); //0600 READ && WRITE + sprintf(msg2sv.fifostr, "CPcliente_%d", getpid()); + mkfifo(msg2sv.fifostr, 0600); //0600 READ && WRITE /* 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("> "); fgets(str, 80, stdin); @@ -43,18 +61,37 @@ int main(int argc, char *argv[]){ palavra[i] = strtok(NULL," "); } if(palavra[0]!=NULL){ - if(strcmp(palavra[0],"send")==0){ - strcpy(mensagem.titulo, "send"); - strcpy(mensagem.corpo, palavra[1]); + if(strcmp(palavra[0],"sair")==0){ + printf("[CLIENT] A sair!\n"); + 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) */ - 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) */ close(fd_servidor); /* REMOVER "cp" DO CLIENTE - EU (UNLINK) */ - unlink(mensagem.addrss); + unlink(msg2sv.fifostr); } \ No newline at end of file diff --git a/server b/server index df9f949..c3b46a8 100644 Binary files a/server and b/server differ diff --git a/server.c b/server.c index 234b29e..d959ba2 100644 --- a/server.c +++ b/server.c @@ -15,10 +15,11 @@ int main(int argc, char *argv[]){ int sair=0, mopt=-1, n; - msg mensagem; + sv2cl msg2cl; + cl2sv clResp; srand(time(NULL)); - int fd_servidor; + int fd_servidor, fd_cliente; /* VERIFICAR SE EXISTE "CP" DO SERVIDOR (access) -- APENAS UM!!!*/ if(access("CPservidor", F_OK)==0){ printf("[SERVIDOR] Ja existe um servidor!\n"); @@ -34,18 +35,37 @@ int main(int argc, char *argv[]){ /* Fazer coisas aqui! */ do{ - n = read(fd_servidor,&mensagem, sizeof(mensagem)); + n = read(fd_servidor,&clResp, sizeof(clResp)); if(n == 0){ printf("[SERVER] deu merda!\n"); sleep(1); 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("%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"); diff --git a/util.h b/util.h index 9f5d8af..43aaad8 100644 --- a/util.h +++ b/util.h @@ -1,25 +1,56 @@ #define TAM_TITULO 128 #define TAM_CORPO 1001 #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; char titulo[TAM_TITULO]; char corpo[TAM_CORPO]; int duracao; int time_added; - char addrss[20]; + struct topic * topico; + struct mensagem * prox; +}mensagem; - struct topicdef * topico; - struct msgdef * prox; -}msg; - -typedef struct topicdef -{ +typedef struct{ int id; char nome[TAM_NOME]; - struct msgdef * mensg; - struct topicdef * prox; + struct mensagem * mensg; + struct topic * prox; }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;