Exemple #1
0
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;
        }
    }
}
Exemple #2
0
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();
}
Exemple #3
0
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;
        }
    }
}
Exemple #4
0
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;
}