Skip to content
Snippets Groups Projects
Commit c041b7ca authored by Eduardo Machado's avatar Eduardo Machado
Browse files

testando lsr 2

parent 94bd5606
No related branches found
No related tags found
No related merge requests found
...@@ -22,7 +22,7 @@ class Message{ ...@@ -22,7 +22,7 @@ class Message{
static int receiveLS(unsigned char*, char*); // Lida com mensagens tipo LS static int receiveLS(unsigned char*, char*); // Lida com mensagens tipo LS
static int receivePUT(unsigned char*, char*); // Lida com... ok você entendeu static int receivePUT(unsigned char*, char*); // Lida com... ok você entendeu
static int receiveGET(unsigned char*); static int receiveGET(unsigned char*);
static string receiveData(unsigned char*, int); // Método que recebe as mensagens e as agrupa static string receiveData(int); // Método que recebe as mensagens e as agrupa
static int lsParameter(string); // Usado para decidir qual tipo de ls será feito. static int lsParameter(string); // Usado para decidir qual tipo de ls será feito.
}; };
...@@ -9,7 +9,7 @@ class SubMessage{ ...@@ -9,7 +9,7 @@ class SubMessage{
private: private:
unsigned char startMessage; // Delimitador de início. unsigned char startMessage; // Delimitador de início.
int sizSeqTyp; // 6 bits para tamanho, 6 bits para sequencia e 4 bits para o tipo. int sizSeqTyp; // 6 bits para tamanho, 6 bits para sequencia e 4 bits para o tipo.
unsigned char *data = (unsigned char*)""; // Área para envio dos dados. unsigned char *data = (unsigned char*)malloc(sizeof(unsigned char)); // Área para envio dos dados.
unsigned char parity; // 1 Byte para a paridade vertical (detecção de erros). unsigned char parity; // 1 Byte para a paridade vertical (detecção de erros).
// Calcula a paridade da mensagem, esse método está como privado para ser // Calcula a paridade da mensagem, esse método está como privado para ser
......
...@@ -88,6 +88,8 @@ int main(int argc, char *argv[]) { ...@@ -88,6 +88,8 @@ int main(int argc, char *argv[]) {
resposta.setData((unsigned char*)"4",0,0); // Manda um Nack resposta.setData((unsigned char*)"4",0,0); // Manda um Nack
send(soquete,resposta.objToString(),68, 0); send(soquete,resposta.objToString(),68, 0);
} else { } else {
resposta.setData((unsigned char*)"4",1,0); // Manda um ack
send(soquete,resposta.objToString(),68, 0);
cout << "res " << serverReceive.getData() << endl; cout << "res " << serverReceive.getData() << endl;
if(mainMessage.receiveLS(serverReceive.getData(), currentPath)){ if(mainMessage.receiveLS(serverReceive.getData(), currentPath)){
cout << "ERRO: ls remoto."; cout << "ERRO: ls remoto.";
......
...@@ -66,27 +66,29 @@ int Message::sendCD(unsigned char* dirName){ ...@@ -66,27 +66,29 @@ int Message::sendCD(unsigned char* dirName){
} }
int Message::sendLS(unsigned char* options){ int Message::sendLS(unsigned char* options){
int error, success = 0, garbage, rv; int error, success, garbage, rv;
char *receiptMessage = (char*)malloc(sizeof(char*)*68); char *receiptMessage = (char*)malloc(sizeof(char*)*68);
struct pollfd ufds[1]; // usado para timeout em recv struct pollfd ufds[1]; // usado para timeout em recv
char *listagem, sequence[3];
SubMessage listDir, answer, ack, nack; SubMessage listDir, answer, ack, nack;
string showLS;
ufds[0].fd = soquete; ufds[0].fd = soquete;
ufds[0].events = POLLIN; ufds[0].events = POLLIN;
cout << "lsr ----> 1 " << endl;
listDir.setData(options,4,0); listDir.setData(options,4,0);
cout << "lsr ----> 1 " << endl;
while(!success){ while(!success){
error = send(soquete, listDir.objToString(), 68, 0); error = send(soquete, listDir.objToString(), 68, 0);
if (error == -1){ if (error == -1){
cout << "Erro ao tentar listar diretorio (messages.cpp::sendLS)" << endl; cout << "Erro ao tentar listar diretorio (messages.cpp::sendLS)" << endl;
} }
cout << "lsr ----> 1 " << endl;
garbage = 0; garbage = 0;
success = 0;
while((garbage < 10) && (!success)){ while((garbage < 10) && (!success)){
// vetor de pollfd, numero de buffers observados, timeout(ms) // vetor de pollfd, numero de buffers observados, timeout(ms)
rv = poll(ufds, 1, 500); rv = poll(ufds, 1, 500);
garbage++;
if(rv){ if(rv){
if(rv == -1){ if(rv == -1){
cout << "Erro no recebimento de resposta (messages.cpp::sendLS)" << endl; cout << "Erro no recebimento de resposta (messages.cpp::sendLS)" << endl;
...@@ -97,49 +99,19 @@ int Message::sendLS(unsigned char* options){ ...@@ -97,49 +99,19 @@ int Message::sendLS(unsigned char* options){
if(receiptMessage[0] == 0x7E){ // 0x7E = 01111110 if(receiptMessage[0] == 0x7E){ // 0x7E = 01111110
answer.stringToObj((unsigned char*)receiptMessage); answer.stringToObj((unsigned char*)receiptMessage);
success = 1; success = 1;
if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra
// Mostra as mensagens
if(answer.checkParity()){ // Caso a paridade dê errado if(answer.checkParity()){ // Caso a paridade dê errado
sprintf(sequence, "%d", answer.getSeq()); success = 0; // Vai reenviar
nack.setData((unsigned char*)sequence,0,0); // Manda um nack
send(soquete,nack.objToString(),68, 0);
success = 0;
}else{ }else{
strcat(listagem,(char*)answer.getData()); // Põe o valor recebido em "listagem" if(answer.getType() == 1){
success = 0; showLS = receiveData(10);
while(!success){ if(showLS != ""){
rv = poll(ufds, 1, 500); // Observa por novas mensagens
if(rv){
recv(soquete, receiptMessage, 68, 0);
if(receiptMessage[0] == 0x7E){
answer.stringToObj((unsigned char*)receiptMessage);
if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra
if(answer.checkParity()){ // Caso a paridade dê errado
sprintf(sequence, "%d", answer.getSeq());
nack.setData((unsigned char*)sequence,0,0); // Manda um nack
send(soquete,nack.objToString(),68, 0);
success = 0;
} else {
if(receiveData((unsigned char*)"ls", atoi((char*)answer.getData())) != ""){
success = 1; success = 1;
}else{ }else{
success = 0; success = 0;
} }
} }else if(answer.getType() == 0){
} success = 0;
} }else if(answer.getType() == 14){
} else {
cout << "TIMEOUT DO LS (messages.cpp::sendLS)" << endl;
}
}
}
cout << listagem << endl;
return 0; // YAY
} else if(answer.getType() == 0){ // 0 = NACK
// NACK
success = 0; // reenvia pedido
} else if(answer.getType() == 14){ //14 = 0xE --> Erro
// ERRO
if(answer.getData()[0] == '0'){ if(answer.getData()[0] == '0'){
cout << "Opção inválida, por favor tente -l, -a ou -la\n" << endl; cout << "Opção inválida, por favor tente -l, -a ou -la\n" << endl;
return -1; return -1;
...@@ -149,11 +121,11 @@ int Message::sendLS(unsigned char* options){ ...@@ -149,11 +121,11 @@ int Message::sendLS(unsigned char* options){
} }
} }
} }
}
} else{ } else{
cout << "Tempo limite de resposta excedido :c\n" << endl; cout << "Tempo limite de resposta excedido :c\n" << endl;
cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl; cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl;
} }
garbage++;
} }
} }
} }
...@@ -316,7 +288,7 @@ int Message::sendGET(unsigned char* fileName, char* currentPath){ ...@@ -316,7 +288,7 @@ int Message::sendGET(unsigned char* fileName, char* currentPath){
} else { } else {
ok.setData((unsigned char*)answer.getSeq(),8,0); // Manda um ok ok.setData((unsigned char*)answer.getSeq(),8,0); // Manda um ok
send(soquete,ok.objToString(),ok.getSize()+4, 0); send(soquete,ok.objToString(),ok.getSize()+4, 0);
if(receiveData(fileName,atoi((char*)answer.getData())) == ""){ if(receiveData(13) == ""){
cout << "Erro no recebimento de dados (messages.cpp::sendGET)" << endl; cout << "Erro no recebimento de dados (messages.cpp::sendGET)" << endl;
return -1; return -1;
} else { } else {
...@@ -658,7 +630,7 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){ ...@@ -658,7 +630,7 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){
resposta.setData((unsigned char*)'0',8,0); // Manda um OK resposta.setData((unsigned char*)'0',8,0); // Manda um OK
send(soquete,resposta.objToString(),resposta.getSize()+4, 0); send(soquete,resposta.objToString(),resposta.getSize()+4, 0);
// Fica esperando dados // Fica esperando dados
if(receiveData(fileName,size) == ""){ if(receiveData(13) == ""){
cout << "Dados recebidos com sucesso!" << endl; cout << "Dados recebidos com sucesso!" << endl;
return 0; return 0;
} else { } else {
...@@ -677,9 +649,9 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){ ...@@ -677,9 +649,9 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){
} }
} }
string Message::receiveData(unsigned char* fileName, int size){ string Message::receiveData(int type){
int numberOfMessages, messagesCounter = 0, seqCounter = 0; int numberOfMessages, messagesCounter = 0, seqCounter = 0;
int i, garbage, error, rv, success = 0; int i, garbage, error, rv, success = 0, size = 0;
char *receiptMessage = (char*)malloc(sizeof(char*)*68); char *receiptMessage = (char*)malloc(sizeof(char*)*68);
struct pollfd ufds[1]; struct pollfd ufds[1];
SubMessage nack, ack, answer; SubMessage nack, ack, answer;
...@@ -689,13 +661,6 @@ string Message::receiveData(unsigned char* fileName, int size){ ...@@ -689,13 +661,6 @@ string Message::receiveData(unsigned char* fileName, int size){
ufds[0].fd = soquete; ufds[0].fd = soquete;
ufds[0].events = POLLIN; ufds[0].events = POLLIN;
// Verifica quantas mensagens serao necessarias
if (size%64){
numberOfMessages = (size/64) + 1;
}else{
numberOfMessages = (size/64);
}
numberOfMessages++; // +1 = Mensagem de FIM
while(!success){ while(!success){
rv = poll(ufds, 1, 500); rv = poll(ufds, 1, 500);
...@@ -712,11 +677,14 @@ while(!success){ ...@@ -712,11 +677,14 @@ while(!success){
nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack
send(soquete,nack.objToString(),68, 0); send(soquete,nack.objToString(),68, 0);
}else{ }else{
if(answer.getType() == 13){ if(answer.getType() == type){
if(subData[(seqCounter*64)+answer.getSeq()] == ""){
subData[(seqCounter*64)+answer.getSeq()] = (char*)answer.getData(); subData[(seqCounter*64)+answer.getSeq()] = (char*)answer.getData();
if(answer.getSeq() == 63) seqCounter++;
size++;
}
ack.setData((unsigned char*)answer.getSeq(),1,0); ack.setData((unsigned char*)answer.getSeq(),1,0);
send(soquete, ack.objToString(), 68, 0); // Manda um ACK send(soquete, ack.objToString(), 68, 0); // Manda um ACK
if(answer.getSeq() == 63) seqCounter++;
}else if(answer.getType() == 15){ }else if(answer.getType() == 15){
success = 1; success = 1;
ack.setData((unsigned char*)answer.getSeq(),1,0); ack.setData((unsigned char*)answer.getSeq(),1,0);
...@@ -734,7 +702,7 @@ while(!success){ ...@@ -734,7 +702,7 @@ while(!success){
} }
} }
for(i = 0; i < numberOfMessages; ++i){ for(i = 0; i < size; ++i){
finalMessage += subData[i]; finalMessage += subData[i];
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment