diff --git a/Protocol.cpp b/Protocol.cpp index ee6d55225a4508b98694c683a6f832d6b077212a..321b3c40e49e231c0a263af53751503dc17dfc5b 100644 --- a/Protocol.cpp +++ b/Protocol.cpp @@ -116,14 +116,19 @@ int Protocol::recvMessage(int sockt){ void Protocol::transmit(int sockt, int window){ int status; vector<FrameItem> frame; - int lastFramed = 0; + int lastFramed = -1; + setData(vector<BYTE>(1, 0), ENDTX); int messagesLeft = messages.size(); Protocol response; while(messagesLeft > 0){ + cout << "Restantes: " << messagesLeft << endl; for(int j=0; j < window; ++j) { - // FIXME: this will probably brake with many messages - FrameItem fi = {.index = lastFramed++, .sent=false}; - frame.push_back(fi); + if(frame.size() < window && frame.size() < messagesLeft) { + cout << "frame size: " << frame.size() << endl; + FrameItem fi = {.index = ++lastFramed, .sent=false}; + cout << "lastFramed: " << fi.index << endl; + frame.push_back(fi); + } if(!frame[j].sent){ sendMessage(sockt, frame[j].index); frame[j].sent = true; @@ -135,33 +140,26 @@ void Protocol::transmit(int sockt, int window){ if(status == NACK){ printf("nstoi %i\n", response.getMessages().back().getDataAsString()[0]); int nackIndex = response.getMessages().back().getDataAsString()[0]; - for(int j=0; j < window; ++j) { + for(int j=0; j < window;) { if(frame[j].index < nackIndex) { frame.erase(frame.begin() + j); --messagesLeft; - }else if(frame[j].index == nackIndex) { + } else if(frame[j].index == nackIndex) { frame[j].sent = false; - } + } else ++j; } response.reset(); }else if(status == ACK){ printf("astoi %i\n", response.getMessages().back().getDataAsString()[0]); int ackIndex = response.getMessages().back().getDataAsString()[0]; - for(int j=0; j < window; ++j) { + for(int j=0; j < frame.size();) { if(frame[j].index <= ackIndex) { frame.erase(frame.begin() + j); --messagesLeft; - } + } else ++j; } response.reset(); - // }else if(status == OK) { - // frame.erase(frame.begin()); - // --messagesLeft; - // } else if(status == OUTPUT || status == ERROR) { - // frame.erase(frame.begin()); - // --messagesLeft; - // cout << "Remoto:\n" << ((status == ERROR)?"ERROR: ":"") << getDataAsString() << endl; } else { //TODO: treat error } @@ -190,54 +188,25 @@ int Protocol::receive(int sockt, int type, int window, bool dataEndable){ continue; } else if(status == type) { if(!messages.empty() && (messages.back().sequence.to_ulong() != nextSequence)){ + messages.pop_back(); 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); - shouldSend = true; } else { - //TODO: treat something? + if(window == WAIT_STOP || ((nextSequence % SLIDING) == 0)) { + response.reset(); + vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong()); + response.setData(val, ACK); + shouldSend = true; + } + 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; return -1; } - - // 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; } diff --git a/client.cpp b/client.cpp index 0ff6cf39b06635d0fec28758da7a673e8c2cc8c5..c5f3b508688677ebd019ead849cc3f4239089429 100644 --- a/client.cpp +++ b/client.cpp @@ -44,14 +44,14 @@ int main(){ }else if(command == "put"){ args = line.substr(pos+1, line.size()); if(fexists(args)) { - int size = filesize(args); + string size = to_string(filesize(args)); cout << "ARQUIVO: " << args << "|" << size << endl; sendProtocol.setData(vector<BYTE>(args.begin(), args.end()), PUT); sendProtocol.sendMessage(sockt, 0); int error = receiveProtocol.receive(sockt, OK, WAIT_STOP, false); if(error < 0) continue; sendProtocol.reset(); - sendProtocol.setData(vector<BYTE>(size), SIZE); + sendProtocol.setData(vector<BYTE>(size.begin(), size.end()), SIZE); sendProtocol.sendMessage(sockt, 0); error = receiveProtocol.receive(sockt, OK, WAIT_STOP, false); if(error < 0) continue; @@ -59,7 +59,8 @@ int main(){ ifstream putFile (args); stringstream buffer; buffer << putFile.rdbuf(); - sendProtocol.setData(vector<BYTE>(buffer.str().begin(), buffer.str().begin()), PUT); + string data = buffer.str(); + sendProtocol.setData(vector<BYTE>(data.begin(), data.end()), DATA); sendProtocol.transmit(sockt, SLIDING); } else { cout << "ERROR: arquivo não existe\n"; @@ -68,9 +69,9 @@ int main(){ args = line.substr(pos+1, line.size()); sendProtocol.setData(vector<BYTE>(args.begin(), args.end()), GET); sendProtocol.sendMessage(sockt, 0); - int error = receiveProtocol.receive()sockt, SIZE, WAIT_STOP, false; + int error = receiveProtocol.receive(sockt, SIZE, WAIT_STOP, false); if(error < 0) continue; - int fileSize = (int) receiveProtocol.getDataAsString(); + // int fileSize = (int) receiveProtocol.getDataAsString()[0]; }else if(command == "help"){ printCommandsList(); }else{ diff --git a/test.sh b/test.sh index 50df3103851fba1b75d47fb54ebb07abc7051134..710caf57de84d744cd4841144b90339e6e04b72f 100755 --- a/test.sh +++ b/test.sh @@ -7,7 +7,7 @@ done for i in {1..100} do - echo -e "$i\n">>10.txt + echo -e "$i\n">>100.txt done for i in {1..1000};