diff --git a/headers/server.h b/headers/server.h index aafc7fe896276ecb577609c72975e792b7745e1e..b2e86160421a08bca9e685f706b4efe432724285 100644 --- a/headers/server.h +++ b/headers/server.h @@ -21,10 +21,10 @@ #include <sys/types.h> // include local +#include "conexao.h" #include "cores.h" #include "frame.h" #include "macros.h" -#include "conexao.h" #define FILE_DESTINATION "./received" @@ -34,34 +34,29 @@ class server { private: // --------- Dados ---------- // - //int soquete; + // int soquete; int tipoReceivingFrames; conexao *socket; - //vector<frame *> framesMidia; + // vector<frame *> framesMidia; // ---------- Funcoes -------- // - frame* create_ack_nack (int tipo, int seq); - int send_nack (frame *fReceive); - int send_ack (frame *fReceive); - bool verify_seq (int seq, int lastSeq); - int next_tipo_midia (frame *f); - bool create_received_dir (); - UL chk_available_size (); - int receive_file_size (frame *f); - string create_file_destination(string fileName); - ofstream create_file (string fileName); - int receive_midia (frame *f); - //void send_confirm(frame *fReceive); - //void receive_text(frame *f); - //int receive_valid_frame(frame **f); - //int receive_file_data(string fileName); - //bool verify_crc8(frame *f); + frame *create_ack_nack(int tipo, int seq); + int send_nack(frame *fReceive); + int send_ack(frame *fReceive); + bool verify_seq(int seq, int lastSeq); + int next_tipo_midia(frame *f); + bool create_received_dir(); + UL chk_available_size(); + int receive_file_size(frame *f); + string create_file_destination(string fileName); + ofstream create_file(string fileName); + int receive_midia(frame *f, ofstream *file); frame *receive_frame_socket(); - queue<frame *> receive_frames_window(int lastSeq); void start_receveing_message(); + queue<frame *> receive_frames_window(int lastSeq); public: // ------- Construtores ------ // @@ -73,15 +68,14 @@ public: // ------------------------------ PRIVATE --------------------------------- // /** - * @brief function that creates a nack or a nack + * @brief function that creates a nack or a nack * * @param tipo ack or nack * @param seq ack or nack sequence number * @return int */ -frame *server::create_ack_nack(int tipo, int seq) -{ +frame *server::create_ack_nack(int tipo, int seq) { vector<char> seq_char; frame *f = new frame(); @@ -104,13 +98,12 @@ int server::send_ack(frame *fReceive) { frame *ack = create_ack_nack(ACK, fReceive->get_seq()); int ackSent = socket->send_frame(ack); - if ( ackSent == -1 ) - { + if (ackSent == -1) { cout << "Falha ao enviar o ack\n"; - return -1; + return -1; } - cout << "ACK " << (int) fReceive->get_seq() << " enviado\n"; + cout << "ACK " << (int)fReceive->get_seq() << " enviado\n"; return ackSent; } @@ -126,12 +119,12 @@ int server::send_nack(frame *fReceive) { frame *nack = create_ack_nack(NACK, fReceive->get_seq()); int nackSent = socket->send_frame(nack); - if ( nackSent == -1 ) { + if (nackSent == -1) { cout << "Falha ao enviar o nack"; - return -1; + return -1; } - cout << "NACK " << (int) fReceive->get_seq() << " enviado\n"; + cout << "NACK " << (int)fReceive->get_seq() << " enviado\n"; return nackSent; } @@ -141,12 +134,11 @@ int server::send_nack(frame *fReceive) { * * @param seq * @param lastSeq - * @return bool + * @return bool */ bool server::verify_seq(int seq, int lastSeq) { - if ( seq == 0 ) - { - if ( lastSeq != TAM_JANELA - 1 ) { return false; } + if (seq == 0) { + if (lastSeq != TAM_JANELA - 1) { return false; } return true; } @@ -155,32 +147,33 @@ bool server::verify_seq(int seq, int lastSeq) { } int server::next_tipo_midia(frame *f) { - if ( f->get_tipo() != MIDIA ) { return -1; } - if ( f->get_seq() == 0 ) { return MIDIA; } - if ( f->get_seq() == 1 ) { + if (f->get_tipo() != MIDIA) { return -1; } + if (f->get_seq() == 0) { return MIDIA; } + if (f->get_seq() == 1) { cout << YELLOW << "\t--Recebendo dados arquivo--\n" << RESET; - return DADOS; } + return DADOS; + } return -1; } //// Recebe uma mensagem em forma de texto -//void server::receive_text(frame *f) { -// string textoReceive; -// textoReceive.append(f->get_dado()); -// int lastSeq = f->get_seq(); +// void server::receive_text(frame *f) { +// string textoReceive; +// textoReceive.append(f->get_dado()); +// int lastSeq = f->get_seq(); // -// do { -// if (!receive_valid_frame(&f)) { return; } -// if (f->get_tipo() != TEXTO) { continue; } -// if (f->get_seq() == lastSeq) { continue; } +// do { +// if (!receive_valid_frame(&f)) { return; } +// if (f->get_tipo() != TEXTO) { continue; } +// if (f->get_seq() == lastSeq) { continue; } // -// lastSeq = f->get_seq(); -// textoReceive.append(f->get_dado()); -// } while (f->get_tipo() != FIMT); +// lastSeq = f->get_seq(); +// textoReceive.append(f->get_dado()); +// } while (f->get_tipo() != FIMT); // -// cout << "Mensagem recebida: " << textoReceive << "\n"; -//} +// cout << "Mensagem recebida: " << textoReceive << "\n"; +// } // //// Verifica o espaco disponivel em disco @@ -198,19 +191,19 @@ UL server::chk_available_size() { //// Recebe o frame com o tamanho do arquivo int server::receive_file_size(frame *f) { - cout << "Recebendo tamanho do frame\n"; - unsigned long availSize = chk_available_size(); - if (availSize == -1) { return -1; } + cout << "Recebendo tamanho do frame\n"; + unsigned long availSize = chk_available_size(); + if (availSize == -1) { return -1; } - cout << "Frame file size:" << f->get_dado() << "\n"; - int fileSize = stoi(f->get_dado()); + cout << "Frame file size:" << f->get_dado() << "\n"; + int fileSize = stoi(f->get_dado()); - if (fileSize > availSize * 0.9) { + if (fileSize > availSize * 0.9) { cout << BOLDMAGENTA << "\t--Tamanho do arquivo muito grande, abortado--\n" << RESET; // send_error(); return 0; - } + } // cout << "Espaco suficiente em disco\n"; ->log return 1; @@ -236,57 +229,56 @@ bool server::create_received_dir() { return true; } -//int server::receive_file_data(string fileName) { +// int server::receive_file_data(string fileName) { // -// int lastSeq = 1; -// frame *f; +// int lastSeq = 1; +// frame *f; // -// cout << "\tRecebendo dados arquivo\n"; -// do { -// cout << "Aguardando frame\n"; +// cout << "\tRecebendo dados arquivo\n"; +// do { +// cout << "Aguardando frame\n"; // -// // Fica tentando receber um frame -// f = receive_frame_socket(); -// if (f == NULL) { return 0; } +// // Fica tentando receber um frame +// f = receive_frame_socket(); +// if (f == NULL) { return 0; } // -// cout << "Frame recebido\n"; -// f->imprime(HEX); +// cout << "Frame recebido\n"; +// f->imprime(HEX); // -// if (f->get_tipo() == FIMT) { break; } +// if (f->get_tipo() == FIMT) { break; } // -// if (f->get_tipo() != DADOS) { continue; } +// if (f->get_tipo() != DADOS) { continue; } // -// if (f->get_seq() == lastSeq) { continue; } +// if (f->get_seq() == lastSeq) { continue; } // -// // Recebeu um frame com uma sequencia errada -// if (!verify_seq(f->get_seq(), lastSeq)) { -// cout << "Frame com a sequencia errada; Pedindo a certa\n"; -// f->set_seq(lastSeq); -// send_ack(f); -// continue; -// } +// // Recebeu um frame com uma sequencia errada +// if (!verify_seq(f->get_seq(), lastSeq)) { +// cout << "Frame com a sequencia errada; Pedindo a certa\n"; +// f->set_seq(lastSeq); +// send_ack(f); +// continue; +// } // -// if (!verify_crc8(f)) { -// cout << "Crc invalido\n"; -// continue; -// } +// if (!verify_crc8(f)) { +// cout << "Crc invalido\n"; +// continue; +// } // -// cout << "Seq " << int(f->get_seq()) << "recebida com sucesso\n"; -// lastSeq = f->get_seq(); -// file.write(f->get_dado(), f->get_tam()); +// cout << "Seq " << int(f->get_seq()) << "recebida com sucesso\n"; +// lastSeq = f->get_seq(); +// file.write(f->get_dado(), f->get_tam()); // -// } while (true); +// } while (true); // -// cout << "Dados do arquivo recebido com sucesso\n"; -// send_ack(f); +// cout << "Dados do arquivo recebido com sucesso\n"; +// send_ack(f); // -// file.close(); -// return 1; -//} +// file.close(); +// return 1; +// } // -string server::create_file_destination(string fileName) -{ +string server::create_file_destination(string fileName) { string fileDestination; fileDestination.append(FILE_DESTINATION); fileDestination.push_back('/'); @@ -296,23 +288,25 @@ string server::create_file_destination(string fileName) } ofstream server::create_file(string fileName) { - cout << "Criando arquivo\n"; - cout << "Nome do arquivo: " << fileName << "\n"; -// long long start = socket->timestamp(); -// struct timeval timeout = {.tv_sec = 0, .tv_usec = socket->timeoutMillis * 1000}; + cout << "Criando arquivo\n"; + cout << "Nome do arquivo: " << fileName << "\n"; + // long long start = socket->timestamp(); + // struct timeval timeout = {.tv_sec = 0, .tv_usec = socket->timeoutMillis * + // 1000}; string fileDestination = create_file_destination(fileName); -// cout << BOLDWHITE << "Criando arquivo " << BOLDYELLOW << fileDestination -// << BOLDWHITE << ". Digite novo nome ou enter para continuar: " << RESET; + // cout << BOLDWHITE << "Criando arquivo " << BOLDYELLOW << fileDestination + // << BOLDWHITE << ". Digite novo nome ou enter para continuar: " << + // RESET; -// string newDestination = ""; -// do { -// getline(cin, newDestination); -// } while (socket->timestamp() - start <= socket->timeoutMillis); + // string newDestination = ""; + // do { + // getline(cin, newDestination); + // } while (socket->timestamp() - start <= socket->timeoutMillis); -// if (!newDestination.empty() && newDestination != "\n") { -// fileDestination = newDestination; -// } + // if (!newDestination.empty() && newDestination != "\n") { + // fileDestination = newDestination; + // } cout << YELLOW << "\t--Criando arquivo: " << fileDestination << "--\n" << RESET; @@ -322,42 +316,34 @@ ofstream server::create_file(string fileName) { return file; } -int server::receive_midia(frame *f) { - cout << "Recebendo midia:\n" - << "Seq: " << int(f->get_seq()) << "\n" - << "Dado: " << f->get_dado() << "\n"; - ofstream file; - +int server::receive_midia(frame *f, ofstream *file) { // Escreve o dado no arquivo - if ( f->get_tipo() == DADOS ) - { - file.write(f->get_dado(), f->get_tam()); + if (f->get_tipo() == DADOS) { + (*file).write(f->get_dado(), f->get_tam()); return 1; } // Primeiro frame de midia - if ( f->get_seq() == 0 ) - { + if (f->get_seq() == 0) { cout << "Recebendo tamanho do arquivo\n"; if (!create_received_dir()) { return 0; } - if (!receive_file_size(f)) { return 0; } + if (!receive_file_size(f)) { return 0; } return 1; } // Segundo frame de midia string fileName = string(f->get_dado()); - file = create_file(fileName); + (*file) = create_file(fileName); - if (!file.is_open()) - { + if (!(*file).is_open()) { cout << RED << "\tFalha ao criar o arquivo. Abortado\n" << RESET; - file.close(); + (*file).close(); remove(create_file_destination(fileName).c_str()); return 0; } // cout << BOLDGREEN << "\t--Arquivo recebido com sucesso--\n" << RESET; - if ( !file.is_open() ) { return 0; } + if (!(*file).is_open()) { return 0; } return 1; } @@ -378,83 +364,52 @@ frame *server::receive_frame_socket() { return fReceive; } -// -//bool server::verify_crc8(frame *f) { -// int crc8 = f->chk_crc8(); -// if (!crc8) { -// send_nack(f); -// } -// else -// send_ack(f); -// return crc8; -//} -// -//int server::receive_valid_frame(frame **f) { -// -// do { -// // Se nao conseguir receber o frame, mata a comunicacao -// *f = receive_frame_socket(); -// if (*f == NULL) { return 0; } -// -// // Avisa o cliente se nao conseguiu receber o frame -// } while (!verify_crc8(*f)); -// return 1; -//} -queue<frame *> server::receive_frames_window(int lastSeq) -{ +queue<frame *> server::receive_frames_window(int lastSeq) { queue<frame *> frames_queue; frame *f; - int midia_cnt = 0; int retries = 0; do { - if ( ! (f = receive_frame_socket()) ) { continue; } - + if (!(f = receive_frame_socket())) { continue; } + retries++; int tipo = f->get_tipo(); // Adiciona o frame de fim de transmissao - if ( tipo == FIMT ) - { + if (tipo == FIMT) { frames_queue.push(f); return frames_queue; } // Primeiro frame a ser recebido, seta o tipo - if ( lastSeq == -1 ) - { + if (lastSeq == -1) { // Ignora os frames perdidos na linha - if ( (tipo != MIDIA && tipo != TEXTO) || f->get_seq() != 0 ) {continue;} + if ((tipo != MIDIA && tipo != TEXTO) || f->get_seq() != 0) { continue; } tipoReceivingFrames = f->get_tipo(); frames_queue.push(f); lastSeq = 0; retries = 0; - midia_cnt++; - continue; + continue; } - // Ignora se o frame nao for do tipo midia e esteja recebendo midia - if ( tipo == MIDIA && tipoReceivingFrames == MIDIA ) - { + if (tipo == MIDIA && tipoReceivingFrames == MIDIA) { // Ignora se for um frame do tipo midia que nao e o segundo da sequencia - if ( !(midia_cnt != 1 && TAM_JANELA == 1) ) { continue; } + if (lastSeq != 0 || f->get_seq() != 1) { continue; } // Se for o segundo frame do tipo midia, muda o tipo esperado tipoReceivingFrames = DADOS; frames_queue.push(f); - midia_cnt++; lastSeq = f->get_seq(); retries = 0; continue; } // Recebe os frames de dados de um arquivo - if ( tipoReceivingFrames == DADOS && tipo == DADOS ) - { - if ( !verify_seq(f->get_seq(), lastSeq) ) { continue; } + if (tipoReceivingFrames == DADOS && tipo == DADOS) { + if (!verify_seq(f->get_seq(), lastSeq)) { continue; } frames_queue.push(f); retries = 0; lastSeq = f->get_seq(); @@ -462,18 +417,18 @@ queue<frame *> server::receive_frames_window(int lastSeq) } // Recebe os frames de uma mensagem - if ( tipoReceivingFrames == TEXTO && tipo == TEXTO ) - { - if ( !verify_seq(f->get_seq(), lastSeq) ) { continue; } + if (tipoReceivingFrames == TEXTO && tipo == TEXTO) { + if (!verify_seq(f->get_seq(), lastSeq)) { continue; } frames_queue.push(f); retries = 0; lastSeq = f->get_seq(); continue; } - } while ( (f == NULL && retries < NUM_RETRIES) || frames_queue.size() < TAM_JANELA ); + } while ((f == NULL && retries < NUM_RETRIES) || + frames_queue.size() < TAM_JANELA); - if ( f == NULL && retries == NUM_RETRIES ) { return queue<frame *>(); } + if (f == NULL && retries == NUM_RETRIES) { return queue<frame *>(); } return frames_queue; } @@ -482,34 +437,33 @@ void server::start_receveing_message() { int continueTransmission = 1; int lastSeq = -1; int tipo_data = -1; - int midia_cnt = 0; vector<char> data; + ofstream file; queue<frame *> client_answer; cout << "Recebendo frames\n"; // Fic aouvindo o cliente ate receber um FIMT do { queue<frame *> frames = receive_frames_window(lastSeq); - if ( frames.empty() ) { return; } + if (frames.empty()) { return; } cout << "Quantidade de frames na janela: " << frames.size() << "\n"; // Ve o que faz com cada frame de acordo com o tipo - while ( !frames.empty() ) - { + while (!frames.empty()) { frame *f = frames.front(); frames.pop(); // Recebeu um frame com erro, retorna um nack e sai da funcao - if ( !f->chk_crc8() ) { + if (!f->chk_crc8()) { client_answer.push(create_ack_nack(NACK, f->get_seq())); continue; } - else { + else { client_answer.push(create_ack_nack(ACK, f->get_seq())); } - + cout << "Frame recebido: \n"; f->imprime(DEC); cout << "\n"; @@ -518,48 +472,43 @@ void server::start_receveing_message() { int tam = f->get_tam(); char *data_f = f->get_dado(); - switch (tipo) - { - case FIMT: - cout << "Encerrou a transmissao\n"; - continueTransmission = 0; - break; - - case TEXTO: - data.insert(data.end(), data_f, data_f + tam); - lastSeq = f->get_seq(); - tipo_data = TEXTO; - break; - - case MIDIA: - if ( TAM_JANELA == 1 && midia_cnt == 1) { f->set_seq(1); } - if ( !receive_midia(f) ) { return; } - tipo_data = next_tipo_midia(f); - midia_cnt++; - break; - - case DADOS: - if ( !receive_midia(f)) { return; } - lastSeq = f->get_seq(); - tipo_data = DADOS; - break; - - default: - break; + switch (tipo) { + case FIMT: + cout << "Encerrou a transmissao\n"; + continueTransmission = 0; + break; + + case TEXTO: + data.insert(data.end(), data_f, data_f + tam); + tipo_data = TEXTO; + break; + + case MIDIA: + if (!receive_midia(f, &file)) { return; } + tipo_data = next_tipo_midia(f); + break; + + case DADOS: + if (!receive_midia(f, &file)) { return; } + tipo_data = DADOS; + break; + + default: + break; } + + lastSeq = f->get_seq(); } cout << "Recebeu todos os frames de uma janela\n"; // Envia a reposta ao cliente cout << "Enviando acks e nacks para o cliente\n"; - while ( !client_answer.empty() ) - { + while (!client_answer.empty()) { frame *f_answer = client_answer.front(); client_answer.pop(); - if (socket->send_frame(f_answer) == -1 ) - { + if (socket->send_frame(f_answer) == -1) { cout << "Falha ao enviar a resposta\n"; return; } @@ -575,12 +524,12 @@ void server::start_receveing_message() { } while (continueTransmission); - if ( tipo_data == TEXTO ) + if (tipo_data == TEXTO) cout << BOLDYELLOW << "\t--Mensagem recebida--\n " << BOLDWHITE << string(data.begin(), data.end()) << "\n" << RESET; - if ( tipo_data == DADOS ) + if (tipo_data == DADOS) cout << BOLDGREEN << "\t--Arquivo recebido com sucesso--\n" << RESET; } @@ -610,7 +559,7 @@ void server::run() { continue; } - if ( send_ack(fReceive) == -1 ) { continue; } + if (send_ack(fReceive) == -1) { continue; } start_receveing_message(); } } diff --git a/received/foto.jpg b/received/foto.jpg index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..42cedf4a23e28ccea764d16047faa18f7149ddb8 100644 Binary files a/received/foto.jpg and b/received/foto.jpg differ diff --git a/received/texto.txt b/received/texto.txt new file mode 100644 index 0000000000000000000000000000000000000000..16914e72e0641b9e2ae68d9c8aef608f1fed464f --- /dev/null +++ b/received/texto.txt @@ -0,0 +1,35 @@ + //string fileSize = calc_file_size(fileName); + //if (fileSize.empty()) { return; } + //franesFile.insert(framesFile.end(), fileSize.begin(), fileSize.end()); + + //cout << "Tamanho do arquivo: " << fileSize << "\n"; + //cout << "Enviando tamanho do arquivo\n"; + //if (!send_message(vector<char>(fileSize.begin(), fileSize.end()), MIDIA)) { + // cout << "Limite de timout, arquivo nao foi enviado\n"; + // return; + //} + + // Envia o segundo frame com o nome do arquivo + //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()) + //{ + // cout << "Falha ao abrir o arquivo para leitura\n"; + // return; + //} + + //if (!send_message(file, DADOS)) { + // cout << "Limite de timout, arquivo nao foi enviado\n"; + // return; + //} +