diff --git a/src/main.cpp b/src/main.cpp index 173bc8451d9b125b7332564ff9986fb61f0de822..a9d29301d2e898642861e3393a5c58a32b639abc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,9 +43,10 @@ int main(int argc, char *argv[]) { cout << currentPath << "(C) " << endl; /* Executa o comando escolhido. */ + cin.clear(); cin >> command; + cin.clear(); if(command == "ls"){ - parameter = ""; cin >> parameter; lsMini(parameter, currentPath); }else if(command == "cd"){ @@ -57,6 +58,9 @@ int main(int argc, char *argv[]) { }else if(command == "lsr"){ cin >> parameter; mainMessage.sendLS((unsigned char*)(parameter.c_str())); + }else if(command == "put"){ + cin >> parameter; + mainMessage.sendPUT((unsigned char*)(parameter.c_str())); } } }else if(service == "server"){ @@ -97,6 +101,17 @@ int main(int argc, char *argv[]) { cout << "ERRO: ls remoto."; } } + }else if(serverReceive.getType() == 5){ + if(serverReceive.checkParity()){ // Se a paridade estiver errada + resposta.setData((unsigned char*)"4",0,0); // Manda um Nack + send(soquete,resposta.objToString(),68, 0); + } else { + resposta.setData((unsigned char*)"4",1,0); // Manda um ack + send(soquete,resposta.objToString(),68, 0); + if(mainMessage.receivePUT(serverReceive.getData(), currentPath)){ + cout << "ERRO: put."; + } + } } } } diff --git a/src/messages.cpp b/src/messages.cpp index dafeb2d8793162675eb48559951ba6e638fd3339..fbb318eb585c7090ac7c8912f479da10be2d9097 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -138,7 +138,7 @@ int Message::sendLS(unsigned char* options){ int Message::sendPUT(unsigned char* fileName){ int error, success = 0, garbage, rv; - char *receiptMessage = (char*)malloc(sizeof(char*)*68); + char *receiptMessage = (char*)malloc(sizeof(char*)*68), fileSize[10]; string temp, fileData; struct pollfd ufds[1]; // usado para timeout em recv SubMessage put, answer, size; @@ -157,7 +157,7 @@ int Message::sendPUT(unsigned char* fileName){ } while(!success){ - error = send(soquete, put.objToString(), put.getSize()+4, 0); + error = send(soquete, put.objToString(), 68, 0); if (error == -1){ cout << "Erro ao enviar arquivo (messages.cpp::sendPUT)" << endl; } @@ -178,8 +178,9 @@ int Message::sendPUT(unsigned char* fileName){ success = 1; if(answer.getType() == 8){ // 8 = OK // OK, mandar tamanho - size.setData((unsigned char*)fileData.size(),9,0); - send(soquete, size.objToString(), size.getSize()+4, 0); + sprintf(fileSize, "%d", fileData.size()); + size.setData((unsigned char*)fileSize,9,0); + send(soquete, size.objToString(), 68, 0); success = 0; while(!success){ rv = poll(ufds, 1, 500); @@ -579,13 +580,15 @@ int Message::receiveGET(unsigned char* fileName){ } int Message::receivePUT(unsigned char* fileName, char* currentPath){ - int success = 0, rv, size, availableSize; + int success = 0, rv, size, availableSize, i; char *receiptMessage = (char*)malloc(sizeof(char*)*68); SubMessage resposta, answer; struct statvfs *buff; struct pollfd ufds[1]; ufds[0].fd = soquete; ufds[0].events = POLLIN; + string receivedFile; + ofstream fileOut; // Calcula espaço livre if(statvfs(currentPath, buff) == -1){ @@ -608,17 +611,22 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){ success = 1; size = atoi((char*)answer.getData()); // Converte o tamanho para int if(answer.checkParity()){ // Se a paridade estiver errada - resposta.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack - send(soquete,resposta.objToString(),resposta.getSize()+4, 0); + resposta.setData((unsigned char*)"0",0,0); // Manda um nack + send(soquete,resposta.objToString(),68, 0); } else if (availableSize < size){ // Se não houver espaço - resposta.setData((unsigned char*)'2',14,0); // Manda um Erro - send(soquete,resposta.objToString(),resposta.getSize()+4, 0); + resposta.setData((unsigned char*)"2",14,0); // Manda um Erro + send(soquete,resposta.objToString(),68, 0); } else { - resposta.setData((unsigned char*)'0',8,0); // Manda um OK - send(soquete,resposta.objToString(),resposta.getSize()+4, 0); + resposta.setData((unsigned char*)"0",8,0); // Manda um OK + send(soquete,resposta.objToString(),68, 0); // Fica esperando dados - if(receiveData(13) == ""){ + receivedFile = receiveData(13); + if(receivedFile != ""){ cout << "Dados recebidos com sucesso!" << endl; + fileOut.open((char*)fileName, ios::binary); + for(i = 0; i < receivedFile.size(); i++){ + fileOut.write((char*)&receivedFile[i], sizeof(unsigned char)); + } return 0; } else { cout << "Erro ao receber dados (messages.cpp::receivePUT)" << endl;