void share(string usuario, string nomeArquivo, CLIENT *cl){ transporteArquivo *arquivo = (transporteArquivo *) malloc(sizeof(transporteArquivo)); ifstream file; int result; // guarda previamente nome do usuário na estrutura de transferência de arquivos strncpy(arquivo->usuario, usuario.c_str(), TAM_MAX_NOME_USER); if(nomeArquivo.length()>TAM_MAX_NOME_ARQ){ // se nome do arquivo for muito grande cout << " " << endl; cout << "Nome do arquivo não pode ter mais de " << TAM_MAX_NOME_ARQ << " caracteres." << endl; } else if((arquivo->tamanho = tamanhoArquivo((usuario + "/" + nomeArquivo))) < 0){ // se retornar -1 //file.open((usuario + "/" + nomeArquivo).c_str(), ios::binary ); //if(!file.is_open() || !file.good()){ //if(!(file = fopen( (usuario + "/" + nomeArquivo).c_str(), "r"))){ cout << " " << endl; cout << "Não foi possível abrir o arquivo." << endl; } else if(arquivo->tamanho > TAM_MAX_REPOSITORIO){ //file.seekg(0, ios::end); //fseek(file, 0, SEEK_END); //arquivo->tamanho = file.tellg(); //file.seekg(0, ios::beg); cout << " " << endl; cout << "Arquivo não pode conter mais de " << TAM_MAX_REPOSITORIO << " bytes." << endl; } else{ // guarda nome do arquivo na estrutura de tranferência de arquivos strncpy(arquivo->nome, nomeArquivo.c_str(), TAM_MAX_NOME_ARQ); file.open((usuario + "/" + nomeArquivo).c_str(), ios::binary ); file.read(arquivo->conteudo, arquivo->tamanho); // guarda conteúdo do arquivo file.close(); cout << " " << endl; cout << "Executando upload do arquivo '" << nomeArquivo << "'..." << endl; // executa e verifica resultado if((result = *share_args_1(arquivo,cl))){ switch(result){ case ERRO_SEM_ESPACO: cout << " " << endl; cout << "Sem espaço no servidor, arquivo colocado na lista de espera, execute o comando 'emptyqueue' para tentar enviar os arquivos da lista da espera." << endl; incluiLista(nomeArquivo); break; case ERRO_ARQ_JA_EXISTE: cout << " " << endl; cout << "Arquivo já compartilhado, escolha outro." << endl; break; default: cout << " " << endl; cout << "Resposta inesperada ou conexão perdida com o servidor." << endl; } } else{ cout << " " << endl; cout << "Envio de arquivo com sucesso!" << endl; } } }
void emptyqueue(string usuario, CLIENT *cl){ transporteArquivo *arquivo = (transporteArquivo *) malloc(sizeof(transporteArquivo)); ifstream file; int result, indice; // guarda previamente nome do usuário na estrutura de transferência de arquivos strncpy(arquivo->usuario, usuario.c_str(), TAM_MAX_NOME_USER); for(indice=0;indice<qtArquivos;indice++){ // guarda tamanho do arquivo para testes arquivo->tamanho = tamanhoArquivo((usuario + "/" + listaReenvio[indice].nomeArquivo)); if(arquivo->tamanho < 0){ // se retornar -1 listaReenvio[indice].status = ERRO_ABRIR_ARQ; } else if(arquivo->tamanho > TAM_MAX_REPOSITORIO){ listaReenvio[indice].status = ERRO_SEM_ESPACO; } else{ // guarda nome do arquivo na estrutura de tranferência de arquivos strncpy(arquivo->nome, listaReenvio[indice].nomeArquivo.c_str(), TAM_MAX_NOME_ARQ); file.open((usuario + "/" + listaReenvio[indice].nomeArquivo).c_str(), ios::binary ); file.read(arquivo->conteudo, arquivo->tamanho); // guarda conteúdo do arquivo file.close(); //cout << "Executando upload do arquivo '" << nomeArquivo << "'..." << endl; // executa e verifica resultado if((result = *share_args_1(arquivo,cl))){ switch(result){ case ERRO_SEM_ESPACO: listaReenvio[indice].status = ERRO_SEM_ESPACO; break; case ERRO_ARQ_JA_EXISTE: listaReenvio[indice].status = ERRO_ARQ_JA_EXISTE; break; default: listaReenvio[indice].status = ERRO_SERVIDOR; } } else{ //enviado com sucesso listaReenvio[indice].status = ENVIO_SUCESSO; if (qtArquivos > 0) qtArquivos--; } } } removeEnviadosLista(); }
void download(string usuario, string nomeArquivo, CLIENT *cl){ // variável utilizada somente para poder enviar usuário e nome do arquivo solicitado transporteArquivo *dados = (transporteArquivo *) malloc(sizeof(transporteArquivo)); // variável que receberá o conteúdo do arquivo solicitado transporteArquivo arquivo; ofstream file; if(tamanhoArquivo(usuario + "/" + nomeArquivo) >= 0){ // se arquivo existe localmente cout << " " << endl; cout << "Não é possível fazer o download do arquivo '" << nomeArquivo << "', pois ele já existe no diretório local." << endl; } else{ cout << " " << endl; cout << "Executando download do arquivo '" << nomeArquivo << "'..." << endl; // prepara argumentos para solicitação strncpy(dados->usuario, usuario.c_str(), TAM_MAX_NOME_USER); strncpy(dados->nome, nomeArquivo.c_str(), TAM_MAX_NOME_ARQ); arquivo = *download_args_1(dados,cl); if(arquivo.tamanho < 0){ // se o arquivo não foi encontrado no servidor cout << " " << endl; cout << "Não foi possível encontrar ou abrir o arquivo '" << nomeArquivo << "' no repositório." << endl; } else{ file.open((usuario + "/" + nomeArquivo).c_str(), ofstream::binary ); file.write(arquivo.conteudo, arquivo.tamanho); // guarda conteúdo do arquivo baixado no arquivo local file.close(); cout << " " << endl; cout << "Download do arquivo realizado com sucesso!" << endl; } } }
int main(void) { int sock; int porta; metadados_t id; struct sockaddr_in cliente; FILE *fp; char nomeArquivo[TAMNOME]; char nomeServidor[TAMNOME]; struct hostent *hp; int tamArquivo; int tamSocket = sizeof (cliente); printf("Entre com a porta de conexão\n"); scanf (" %d", &porta); printf("Entre com o caminho do arquivo a ser enviado\n"); setbuf (stdin, NULL); scanf(" %[^\n]", nomeArquivo); printf("Entre com o nome que o arquivo vai receber no servidor\n"); setbuf (stdin, NULL); scanf(" %[^\n]", nomeServidor); printf("\nServidor: %s", IP); printf(":%d\n", porta); printf("Arquivo enviado: %s\n", nomeArquivo); fp = abrirArquivo(nomeArquivo); tamArquivo = tamanhoArquivo(fp); /** * Os dados do arquivo a ser enviado são alocados * na struct correspondente. */ strcpy(id.nome, nomeServidor); id.tamanho = tamArquivo; /** * Criação do socket para comunicão entre cliente e servidor */ sock = criaSocket(); /** * Configurando o endereço do socket do servidor. */ cliente.sin_family = AF_INET; /** * Estabelecimento de conexão se o cliente e servidor estiverem * rodando no mesmo computador. */ if (strcmp(IP, "localhost") == 0) { if (strcmp(nomeArquivo, nomeServidor) == 0) { perror("Tentativa de sobreescrever o arquivo no mesmo computador!\n"); fechaArquivo(fp); fechaSocket(sock); exit(1); } /** * Pega o endereço de IP de 32-bit do host * por frescurite pode entrar com o dominio em vez do IP */ hp = gethostbyname(IP); if (hp == 0) { perror("FALHA ao pegar endereço de IP!"); fechaArquivo(fp); fechaSocket(sock); exit(1); } //Se estamos aqui deu tudo certo com IP do servidor memcpy(&cliente.sin_addr, hp->h_addr, hp->h_length); } else { /** * Estabelecimento de conexão se o cliente e servidor estiverem * rodando em computadores diferentes. */ cliente.sin_addr.s_addr = inet_addr(IP); } /** * Vinculando a porta informada ao socket do cliente. */ cliente.sin_port = htons(porta); /** * Enviando os dados para o servidor. */ if (sendto(sock, &id, sizeof (id), 0, (struct sockaddr *) &cliente, tamSocket) <= 0) { perror("Falha ao enviar!"); fechaArquivo(fp); fechaSocket(sock); exit(1); } printf("\nChecando o estabelecimento de conexão: enviando %s ", id.nome); printf("com %d bytes\n", id.tamanho); /** * Enviando o arquivo */ enviarArquivo(fp, sock, cliente); /** * O arquivo foi transferido com sucesso. * Todos os arquivos e sockets são fechados. */ printf("\nO arquivo foi enviado com sucesso!\n"); fechaArquivo(fp); fechaSocket(sock); return 0; }