From bdec10ee2b1651045e2c4e5d18b253fc135d3b08 Mon Sep 17 00:00:00 2001 From: bfsc19 <bfsc19@inf.ufpr.br> Date: Sat, 25 Feb 2023 23:47:45 -0300 Subject: [PATCH] testando envio arquivo --- headers/client.h | 22 ++++++++++-------- headers/server.h | 58 +++++++++++++++++++++++++++++++++++++++++++---- teste | Bin 0 -> 33352 bytes 3 files changed, 66 insertions(+), 14 deletions(-) create mode 100755 teste diff --git a/headers/client.h b/headers/client.h index 0590722..d8a15fa 100644 --- a/headers/client.h +++ b/headers/client.h @@ -230,9 +230,9 @@ vector<char> client::read_file(string fileName) { void client::send_file() { string fileName; do { - cout << "Digite o nome do arquivo(maximo de " << TAM_DADOS << " char):\n"; + cout << "Digite o nome do arquivo(maximo de " << TAM_DADOS - 4 << " char):\n"; getline(cin, fileName); - } while (fileName.size() > TAM_DADOS); + } while (fileName.size() > TAM_DADOS - 4); // Envia o primeiro frame com o tamanho do arquivo string fileSize = calc_file_size(fileName); @@ -246,13 +246,17 @@ void client::send_file() { } // Envia o segundo frame com o nome do arquivo - // cout << "Enviando nome do arquivo\n"; - // if (!send_message(vector<char>(fileName.begin(), fileName.end()), MIDIA)) - // { - // cout << "Limite de timout, arquivo nao foi enviado\n"; - // return; - // } - // + cout << "Enviando nome do arquivo\n"; + string name = "NAME"; + vector<char>fileNameVector(name.begin(), name.end()); + fileNameVector.insert(fileNameVector.end(), fileName.begin(), fileName.end()); + + if (!send_message(fileNameVector, MIDIA)) + { + cout << "Limite de timout, arquivo nao foi enviado\n"; + return; + } + // cout << "Enviando arquivo\n"; // vector<char> file = read_file(fileName); // if (file.empty() || !send_message(file, DADOS)) diff --git a/headers/server.h b/headers/server.h index 1294953..0eb1309 100644 --- a/headers/server.h +++ b/headers/server.h @@ -2,6 +2,7 @@ #ifndef _SERVER_ #define _SERVER_ +#include <arpa/inet.h> #include <bits/stdc++.h> #include <fstream> #include <iostream> @@ -15,11 +16,10 @@ #include <string.h> #include <sys/ioctl.h> #include <sys/socket.h> +#include <sys/stat.h> // For stat() and mkdir() functions #include <sys/statvfs.h> #include <sys/types.h> -#include <arpa/inet.h> - // include local #include "conexao.h" #include "frame.h" @@ -49,6 +49,8 @@ private: unsigned long chk_available_size(); long long receive_file_size(frame *f); void start_receveing_message(); + bool create_received_dir(); + bool receive_file_name(); public: // ------- Construtores ------ // @@ -152,10 +154,56 @@ long long server::receive_file_size(frame *f) { return 1; } +bool server::create_received_dir() { + + //check if the directory exists + struct stat info; + if (stat(FILE_DESTINATION, &info) == 0 && (info.st_mode & S_IFDIR)) { + cout << "Diretorio ja existe\n"; + return true; + } + + //create the directory + if (mkdir(FILE_DESTINATION, 0700) == -1) { + cout << "Erro ao criar o diretorio\n"; + return false; + } + + cout << "Diretorio criado com sucesso\n"; + return true; +} + +bool server::receive_file_name() { + frame *fReceive; + + // Aguarda receber um frame do tipo midia com o nome do arquivo + do { + if (!receive_valid_frame(&fReceive)) + { + cout << "Timeout, falha ao receber o nome do arquivo. Abortado\n"; + return false; + } + + if (fReceive->get_tipo() != MIDIA) { continue; } + + } while ( !strncmp(fReceive->get_dado(), "NAME", 4) ); + + cout << "Nome do arquivo recebido com sucesso\n"; + return true; + } + + + +// void server::receive_file_data(){ +// vector<frame *> framesMidia; +// receive + +// }; + void server::receive_midia(frame *f) { - // if ( !create_received_dir) { return; } - if (!receive_file_size(f)) { return; } - // if ( !receive_file_name() { return; } + if ( !create_received_dir() ) { return; } + if ( !receive_file_size(f) ) { return; } + if ( !receive_file_name() ) { return; } // receive_file_data(); } diff --git a/teste b/teste new file mode 100755 index 0000000000000000000000000000000000000000..8b98f312be08825cee66554aeaa895ef0fff3670 GIT binary patch literal 33352 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 literal 0 HcmV?d00001 -- GitLab