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");
		}
	}
}