diff --git a/Protocol.cpp b/Protocol.cpp index e96f14b95408887e05e783232847c9e1f06628f6..081fde22990a24d3f4c8409e6f1db729b859f66e 100644 --- a/Protocol.cpp +++ b/Protocol.cpp @@ -131,7 +131,8 @@ void Protocol::transmit(int sockt, int window){ status = response.recvMessage(sockt); cout << "transmit status:" << status << endl; if(status == NACK){ - int nackIndex = stoi(getDataAsString()); + printf("nstoi %i\n", response.getMessages().back().getDataAsString()[0]); + int nackIndex = response.getMessages().back().getDataAsString()[0]; for(int j=0; j < window; ++j) { if(frame[j].index < nackIndex) { frame.erase(frame.begin() + j); @@ -143,7 +144,8 @@ void Protocol::transmit(int sockt, int window){ response.reset(); }else if(status == ACK){ - int ackIndex = stoi(response.getMessages().back().getDataAsString()); + printf("astoi %i\n", response.getMessages().back().getDataAsString()[0]); + int ackIndex = response.getMessages().back().getDataAsString()[0]; for(int j=0; j < window; ++j) { if(frame[j].index <= ackIndex) { frame.erase(frame.begin() + j); @@ -168,48 +170,73 @@ void Protocol::transmit(int sockt, int window){ sendMessage(sockt,0); } -void Protocol::receive(int sockt, int window){ - int status, nextSequence; +int Protocol::receive(int sockt, int type, int window, bool dataEndable){ + int status, nextSequence = 0; vector<int> frame; Protocol response; bool shouldSend = false; + int end = ((dataEndable)? ENDTX : type); do{ if(shouldSend){ response.sendMessages(sockt); + response.reset(); + shouldSend = false; } status = recvMessage(sockt); + cout << "receive status:" << status << endl; if(status == NOISE){ continue; - }else if(response.getMessages().back().sequence.to_ulong() != nextSequence){ - response.reset(); - vector<BYTE> val(1,(BYTE)nextSequence); - response.setData(val, NACK); - shouldSend = true; - } - else if(status == OUTPUT) { - cout << messages.back().getDataAsString(); - - frame.push_back(messages.size()); - - response.reset(); - vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong()); - response.setData(val, ACK); - nextSequence = (messages.back().sequence.to_ulong()+1)%(MAXSIZE+1); - }else if(status == ERROR){ + } else if(status == type) { + if(messages.back().sequence.to_ulong() != nextSequence){ + response.reset(); + vector<BYTE> val(1,(BYTE)nextSequence); + response.setData(val, NACK); + shouldSend = true; + } else if(window == WAIT_STOP || ((nextSequence % SLIDING) == 0)) { + response.reset(); + vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong()); + response.setData(val, ACK); + nextSequence = (messages.back().sequence.to_ulong()+1)%(MAXSIZE+1); + } else { + //TODO: treat something? + } + } else if(status == ERROR) { string str(messages.back().data.begin(), messages.back().data.end()); cout << "ERROR: " << getDataAsString() << endl; - break; - }else if(status == INCONSISTENT){ - response.reset(); - vector<BYTE> val(1,(BYTE)nextSequence); - response.setData(val, NACK); - shouldSend = true; - }else{ - //TODO: treat error - break; + return -1; } - shouldSend = shouldSend || (frame.size()%window == 0); - }while(status != ENDTX); + + // else if(messages.back().sequence.to_ulong() != nextSequence){ + // response.reset(); + // vector<BYTE> val(1,(BYTE)nextSequence); + // response.setData(val, NACK); + // shouldSend = true; + // } + // else if(status == OUTPUT) { + // cout << messages.back().getDataAsString(); + // + // frame.push_back(messages.size()); + // + // response.reset(); + // vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong()); + // response.setData(val, ACK); + // nextSequence = (messages.back().sequence.to_ulong()+1)%(MAXSIZE+1); + // }else if(status == ERROR){ + // string str(messages.back().data.begin(), messages.back().data.end()); + // cout << "ERROR: " << getDataAsString() << endl; + // break; + // }else if(status == INCONSISTENT){ + // response.reset(); + // vector<BYTE> val(1,(BYTE)nextSequence); + // response.setData(val, NACK); + // shouldSend = true; + // }else{ + // //TODO: treat error + // break; + // } + // shouldSend = shouldSend || (frame.size()%window == 0); + }while(status != end); + return 0; } void Protocol::addMessage(Message msg) { diff --git a/Protocol.h b/Protocol.h index 6577966eaf665acc47778b9ff3497f1a4b3e0d2a..76bf29b8a5d5669d5fd711e425d69eb6a8c95ebe 100644 --- a/Protocol.h +++ b/Protocol.h @@ -19,7 +19,7 @@ public: int recvMessage(int sockt); void addMessage(Message msg); void transmit(int sockt, int window); - void receive(int sockt, int window); + int receive(int sockt, int type, int window, bool dataEndable); void reset(); Protocol(); diff --git a/client.cpp b/client.cpp index 4d261135fa919679c10ae70addce636bfc99cfaa..2044d83b9b3fc34b81cf5f263813d8855c13dcb5 100644 --- a/client.cpp +++ b/client.cpp @@ -31,14 +31,16 @@ int main(){ }else if(command == "cdr"){ args = line.substr(pos+1, line.size()); sendProtocol.setData(vector<BYTE>(args.begin(), args.end()), CD); - sendProtocol.transmit(sockt, WAIT_STOP); + sendProtocol.sendMessage(sockt, 0); + receiveProtocol.receive(sockt, OK, WAIT_STOP, false); + cout << "Diretório remoto: " << args; }else if(command == "lsr"){ line.replace(line.find("lsr"), string("lsr").length(), "ls"); sendProtocol.setData(vector<BYTE>(line.begin(), line.end()), LS); sendProtocol.sendMessage(sockt,0); cout << "Remoto:" << endl; - receiveProtocol.receive(sockt, WAIT_STOP); - cout << endl; + receiveProtocol.receive(sockt, OUTPUT, WAIT_STOP, true); + cout << receiveProtocol.getDataAsString() << endl; }else if(command == "put"){ sendProtocol.setData(vector<BYTE>(line.begin(), line.end()), PUT); sendProtocol.transmit(sockt, WAIT_STOP);