diff --git a/Protocol.cpp b/Protocol.cpp index a376c73336a13a4dc479d8466ee5c888ee8af098..7d37b7a178130416fa925af6d3808beed1d18cd6 100644 --- a/Protocol.cpp +++ b/Protocol.cpp @@ -113,11 +113,11 @@ int Protocol::recvMessage(int sockt){ return (int)msg.type.to_ulong(); } -void Protocol::transmit(int sockt, int window){ +void Protocol::transmit(int sockt, int window, bool dataEndable){ int status; vector<FrameItem> frame; int lastFramed = -1; - setData(vector<BYTE>(1, 0), ENDTX); + if(dataEndable) setData(vector<BYTE>(1, 0), ENDTX); int messagesLeft = messages.size(); Protocol response; while(messagesLeft > 0){ @@ -171,9 +171,6 @@ void Protocol::transmit(int sockt, int window){ } } reset(); - vector<BYTE> val(1,(BYTE)0); - setData(val, ENDTX); - sendMessage(sockt,0); } int Protocol::receive(int sockt, int type, int window, bool dataEndable){ @@ -190,7 +187,7 @@ int Protocol::receive(int sockt, int type, int window, bool dataEndable){ } status = recvMessage(sockt); cout << "receive status:" << status << endl; - cout << "sequence: "<<messages.back().sequence.to_ulong()<<" next: "<<nextSequence<<endl; + // cout << "sequence: "<<messages.back().sequence.to_ulong()<<" next: "<<nextSequence<<endl; if(status == NOISE){ continue; } else if(status == type) { @@ -219,6 +216,7 @@ int Protocol::receive(int sockt, int type, int window, bool dataEndable){ vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong()); response.setData(val, ACK); response.sendMessages(sockt); + messages.pop_back(); } return 0; } diff --git a/Protocol.h b/Protocol.h index 76bf29b8a5d5669d5fd711e425d69eb6a8c95ebe..242722417ae046ba3d55a62eb8fa15ecc72af0f8 100644 --- a/Protocol.h +++ b/Protocol.h @@ -18,7 +18,7 @@ public: string getDataAsString(); int recvMessage(int sockt); void addMessage(Message msg); - void transmit(int sockt, int window); + void transmit(int sockt, int window, bool dataEndable); int receive(int sockt, int type, int window, bool dataEndable); void reset(); diff --git a/client.cpp b/client.cpp index c5f3b508688677ebd019ead849cc3f4239089429..cf6fcaabaaf54b7b784a0027d73b017c71c5ab36 100644 --- a/client.cpp +++ b/client.cpp @@ -65,13 +65,34 @@ int main(){ } else { cout << "ERROR: arquivo não existe\n"; } + sendProtocol.reset(); + receiveProtocol.reset(); }else if(command == "get"){ 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); if(error < 0) continue; - // int fileSize = (int) receiveProtocol.getDataAsString()[0]; + string s_size = receiveProtocol.getDataAsString(); + cout << s_size << endl; + unsigned int fileSize = stoi(s_size); + cout << "Tamanho: " << fileSize << endl; + sendProtocol.reset(); + if(hasEnoughSpace(fileSize)) { + sendProtocol.setData(vector<BYTE>(1,(BYTE)0), OK); + sendProtocol.sendMessage(sockt,0); + } else { + cout << "ERROR: não há espaço disponível\n"; + sendProtocol.setData(vector<BYTE>(1,(BYTE)SPACE_ERR), ERROR); + sendProtocol.sendMessage(sockt,0); + continue; + } + receiveProtocol.reset(); + receiveProtocol.receive(sockt,DATA,SLIDING,true); + cout <<"conteudo: "<< receiveProtocol.getDataAsString()<<endl; + writeFile(getWorkingPath()+"/"+args,receiveProtocol.getData()); + sendProtocol.reset(); + receiveProtocol.reset(); }else if(command == "help"){ printCommandsList(); }else{