int ligarBackup(char *ip, char *port){ int sockfd; char address_port[100]; strcpy(address_port, ip); strcat(address_port, ":"); strcat(address_port, port); strcat(address_port, "\0"); servidor=rtable_bind(address_port); //Se o servidor backup não tiver sido inicializado noutra maquina e' recusada a ligação struct sockaddr_in server; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { perror("Erro ao criar socket"); return -1; } // Preenche estrutura server para bind server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(atoi(port)); return sockfd; }
int main(int argc, char**argv){ //verifica se tem no argumento o adress_port if(argc < 2) { perror("Poucos ou muitos argumentos"); return -1; } char ** outKeys; char *input = malloc(100 * sizeof(char)); struct data_t *inData, *outData; struct rtable_t *rtable; char *instruction; char *inKeyData; char *inKey; int numSpace,i; if((rtable = rtable_bind(argv[1])) == NULL) { perror("Erro ao conectar-se ao servidor"); return -1; } while(1){ printf("Enter an instruction: "); fgets(input, 100, stdin); //Numero de Espaços for(i=0,numSpace=0;input[i]!='\0';i++) if(input[i] == ' ') numSpace++; switch(numSpace) { case 0: instruction = strtok(input,"\n"); break; case 1: instruction = strtok(input," "); inKey = strtok(NULL,"\n"); break; case 2: instruction = strtok(input," "); inKey = strtok(NULL," "); inKeyData = strtok(NULL,"\n"); if(inKey != NULL && inKeyData != NULL) inData = data_create2(strlen(inKeyData),inKeyData); break; default: instruction = ""; break; } if(strcmp(instruction,"put") == 0 && numSpace == 2) { if(rtable_put(rtable,inKey,inData)==0) { printf("Operação executada com sucesso\n"); } else { printf("Operação executa com insucesso\n"); } data_destroy(inData); } else if(strcmp(instruction,"get") == 0 && numSpace == 1) { if(strcmp(inKey,"!") == 0) { outKeys = rtable_get_keys(rtable); if(outKeys != NULL) { printf("Operação executada com sucesso\n"); for(i = 0; outKeys[i] != NULL ; i++) { printf("A tabela remota tem a key: %s\n", outKeys[i]); } rtable_free_keys(outKeys); } else { printf("Operação executa com insucesso\n"); } } else { outData = rtable_get(rtable,inKey); if(outData != NULL) { printf("Operação executada com sucesso\n"); printf("Data recebida com tamanho %d\n",outData->datasize); data_destroy(outData); } else { printf("Operação executa com insucesso\n"); } } } else if(strcmp(instruction,"update" ) == 0 && numSpace == 2) { if(rtable_update(rtable,inKey,inData)==0) { printf("Operação executada com sucesso\n"); } else { printf("Operação executa com insucesso\n"); } data_destroy(inData); } else if(strcmp(instruction,"del") == 0 && numSpace == 1) { if(rtable_del(rtable,inKey)==0) { printf("Operação executada com sucesso\n"); } else { printf("Operação executa com insucesso\n"); } } else if(strcmp(instruction,"size") == 0 && numSpace == 0) { printf("Numero de elementos da tabela remota: %d\n",rtable_size(rtable)); } else if(strcmp(instruction,"quit") == 0 && numSpace == 0) { free(input); if(rtable_unbind(rtable)<0) { perror("rtable_unbind"); return -1; } printf("Adeus humano!\n"); return 0; } else { printf("Non-valid instruction\n"); } } }