diff --git a/src/messages.cpp b/src/messages.cpp
index 65a35c472a56c05b93948bb27f2061ab33b61e72..974a71631a29f26ba440bc7fcdd3491e2f119b83 100644
--- a/src/messages.cpp
+++ b/src/messages.cpp
@@ -247,6 +247,77 @@ int Message::sendPUT(unsigned char* fileName){
   }
 }
 
+int Message::sendGET(unsigned char* fileName){
+  int error, success = 0, garbage, rv;
+  char *receiptMessage = (char*)malloc(sizeof(char*)*64);
+  string temp, fileData;
+  struct pollfd ufds[1]; // usado para timeout em recv
+  SubMessage get, answer, ack, nack, err, ok;
+  ofstream fileOut;
+
+  ufds[0].fd = soquete;
+  ufds[0].events = POLLIN;
+
+  get.setData(fileName,6,0);
+
+  while(!success){
+    error = send(soquete, get.objToString(), get.getSize()+4, 0);
+    if (error == -1){
+      cout << "Erro ao receber arquivo (messages.cpp::sendGET)" << endl;
+    }
+
+    garbage = 0;
+    while((garbage < 10) && (!success)){
+      // vetor de pollfd, numero de buffers observados, timeout(ms)
+      rv = poll(ufds, 1, 500);
+      if(rv){
+        if(rv == -1){
+          cout << "Erro no recebimento de resposta (messages.cpp::sendGET)" << endl;
+          return -1;
+        } else {
+          recv(soquete, receiptMessage, 68*sizeof(char), 0);
+          answer.stringToObj((unsigned char*)receiptMessage);
+          // Lê começo da mensagem e vê se tem o delimitador de início
+          if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
+            if(answer.getType() == 0){
+              success = 0;
+            } else if (answer.getType() == 15){ // Erro
+              if(answer.getData()[0] == '0'){
+                cout << "Arquivo Inexistente" << endl;
+                ack.setData((unsigned char*)answer.getSeq(),1,0);
+                send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK
+                return -1;
+              } else if (answer.getData()[0] == '1'){
+                cout << "Sem permissão para baixar o arquivo" << endl;
+                ack.setData((unsigned char*)answer.getSeq(),1,0);
+                send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK
+                return -1;
+              } else {
+                success = 0;
+              }
+            } else if (answer.getType() == 9){ // Tamanho
+              if(testaSeTamanhoEhInvalido()){
+                err.setData((unsigned char*)answer.getSeq(),1,0);
+                send(soquete, err.objToString(), err.getSize()+4, 0); // Erro
+                return -1;
+              } else if(answer.checkParity()){
+                nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack
+                send(soquete,nack.objToString(),nack.getSize()+4, 0);
+                return -1;
+              } else {
+                ok.setData((unsigned char*)answer.getSeq(),8,0); // Manda um ok
+                send(soquete,ok.objToString(),ok.getSize()+4, 0);
+                funcaoRecebeDados();
+                return 0;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
 int Message::sendData(unsigned char* stringMessage){
   int numberOfMessages, sizeLastMessage, size=0;
   int i, j, k, garbage, error, rv, success = 0;