diff --git a/Protocol.cpp b/Protocol.cpp index 7d37b7a178130416fa925af6d3808beed1d18cd6..f481d35daac77ac2356ef705a9dcca73f9f89525 100644 --- a/Protocol.cpp +++ b/Protocol.cpp @@ -1,4 +1,5 @@ #include <sys/socket.h> +#include <sys/time.h> #include "Protocol.h" #include "definitions.h" @@ -7,6 +8,12 @@ typedef struct{ bool sent; }FrameItem; +double timestamp(void) { + struct timeval tp; + gettimeofday(&tp, NULL); + return ((double)(tp.tv_sec + tp.tv_usec/1000000.0)); +} + vector<Message> Protocol::getMessages(){ return messages; } @@ -27,7 +34,7 @@ bool Protocol::sendMessages(int socket) { } bool Protocol::sendMessage(int socket, int index) { - cout << "message sent: " << messages[index] << endl; + // cout << "message sent: " << messages[index] << endl; vector<BYTE> message = messages[index].getMessage(); unsigned char* msg = reinterpret_cast<unsigned char*> (message.data()); int status = send(socket, msg, messages[index].getMessageSize(), 0); @@ -88,57 +95,60 @@ int Protocol::setData(vector<BYTE> data, int type){ int Protocol::recvMessage(int sockt){ BYTE dataRec[MAXSIZE+4]; int r = recv(sockt, dataRec, MAXSIZE+4, 0); - cout << "begin: "<< bitset<8>(dataRec[0]) <<endl; - cout << "recv response: " << r << endl; + // cout << "begin: "<< bitset<8>(dataRec[0]) <<endl; + // cout << "recv response: " << r << endl; if(dataRec[0] != BEGIN){ return NOISE; } Message msg = Message(); int size = (int)(dataRec[1]>>2); - cout << "Tamanho:" << size << "\t"; + // cout << "Tamanho:" << size << "\t"; int dataSize = size < MINSIZE ? MINSIZE : size; msg.setBitFields(dataRec[0], dataRec[1], dataRec[2], dataRec[dataSize+3]); - cout << "Sequence:" << msg.sequence.to_ulong() << "\t"; + // cout << "Sequence:" << msg.sequence.to_ulong() << "\t"; BYTE msgData[size]; memcpy(msgData,dataRec+3,size); msg.data.insert(msg.data.end(), msgData, msgData+size); messages.push_back(msg); - cout << "Tipo:" << (int)msg.type.to_ulong() << endl; + // cout << "Tipo:" << (int)msg.type.to_ulong() << endl; - cout <<"message received: "<< msg<<endl; + // cout <<"message received: "<< msg<<endl; if(!msg.checkParity()){ return INCONSISTENT; } return (int)msg.type.to_ulong(); } -void Protocol::transmit(int sockt, int window, bool dataEndable){ +void Protocol::transmit(int sockt, int window){ int status; vector<FrameItem> frame; int lastFramed = -1; - if(dataEndable) setData(vector<BYTE>(1, 0), ENDTX); + setData(vector<BYTE>(1, 0), ENDTX); int messagesLeft = messages.size(); Protocol response; + double t0 = 0.0; + bool timeout = false; while(messagesLeft > 0){ cout << "Restantes: " << messagesLeft << endl; for(int j=0; j < window; ++j) { if(frame.size() < window && frame.size() < messagesLeft) { - cout << "frame size: " << frame.size() << endl; + // cout << "frame size: " << frame.size() << endl; FrameItem fi = {.index = ++lastFramed, .sent=false}; - cout << "lastFramed: " << fi.index << endl; + // cout << "lastFramed: " << fi.index << endl; frame.push_back(fi); } - if(!frame[j].sent){ + if(!frame[j].sent || timeout){ sendMessage(sockt, frame[j].index); frame[j].sent = true; + t0 = timestamp(); } } // TODO: timeout status = response.recvMessage(sockt); - cout << "transmit status:" << status << endl; + // cout << "transmit status:" << status << endl; if(status == NACK){ - printf("nstoi %i\n", response.getMessages().back().getDataAsString()[0]); + // printf("nstoi %i\n", response.getMessages().back().getDataAsString()[0]); int nackIndex = response.getMessages().back().getDataAsString()[0]; for(int j=0; j < window;) { if(frame[j].index < nackIndex) { @@ -149,12 +159,13 @@ void Protocol::transmit(int sockt, int window, bool dataEndable){ } else ++j; } response.reset(); + t0 = timestamp(); }else if(status == ACK){ - printf("astoi %i\n", response.getMessages().back().getDataAsString()[0]); + // printf("astoi %i\n", response.getMessages().back().getDataAsString()[0]); int ackIndex = response.getMessages().back().getDataAsString()[0]; for(int j=0; j < frame.size();) { - cout << "ackIndex: " << ackIndex << "frame[j].index: " << frame[j].index << endl; + // cout << "ackIndex: " << ackIndex << "frame[j].index: " << frame[j].index << endl; if(ackIndex == 0) { if((frame[j].index % (MAXSIZE+1)) == 62 || (frame[j].index % (MAXSIZE+1)) == 63 || (frame[j].index % (MAXSIZE+1)) == 0) { frame.erase(frame.begin() + j); @@ -166,9 +177,12 @@ void Protocol::transmit(int sockt, int window, bool dataEndable){ } else ++j; } response.reset(); + t0 = timestamp(); } else { //TODO: treat error } + timeout = ((timestamp() - t0) > 2.0); + if(timeout) cout << "TIMEOUT!\n"; } reset(); } @@ -186,7 +200,7 @@ int Protocol::receive(int sockt, int type, int window, bool dataEndable){ shouldSend = false; } status = recvMessage(sockt); - cout << "receive status:" << status << endl; + // cout << "receive status:" << status << endl; // cout << "sequence: "<<messages.back().sequence.to_ulong()<<" next: "<<nextSequence<<endl; if(status == NOISE){ continue; diff --git a/Protocol.h b/Protocol.h index 242722417ae046ba3d55a62eb8fa15ecc72af0f8..fba73fb378af1e9ea6cb50c272430898a55eb5c1 100644 --- a/Protocol.h +++ b/Protocol.h @@ -7,7 +7,6 @@ class Protocol{ private: vector<Message> messages; - int timeout; public: bool sendMessages(int socket); bool sendMessage(int socket, int index); @@ -18,7 +17,7 @@ public: string getDataAsString(); int recvMessage(int sockt); void addMessage(Message msg); - void transmit(int sockt, int window, bool dataEndable); + void transmit(int sockt, int window); int receive(int sockt, int type, int window, bool dataEndable); void reset(); diff --git a/client.cpp b/client.cpp index cf6fcaabaaf54b7b784a0027d73b017c71c5ab36..954f302e378cf0044f9b68a1d5f5c09125f717ca 100644 --- a/client.cpp +++ b/client.cpp @@ -38,14 +38,14 @@ int main(){ 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; + cout << "Remoto:\n"; receiveProtocol.receive(sockt, OUTPUT, WAIT_STOP, true); cout << receiveProtocol.getDataAsString() << endl; }else if(command == "put"){ args = line.substr(pos+1, line.size()); if(fexists(args)) { string size = to_string(filesize(args)); - cout << "ARQUIVO: " << args << "|" << size << endl; + cout << "ARQUIVO: " << args << "|\tTAMANHO:" << size << endl; sendProtocol.setData(vector<BYTE>(args.begin(), args.end()), PUT); sendProtocol.sendMessage(sockt, 0); int error = receiveProtocol.receive(sockt, OK, WAIT_STOP, false); @@ -76,7 +76,7 @@ int main(){ string s_size = receiveProtocol.getDataAsString(); cout << s_size << endl; unsigned int fileSize = stoi(s_size); - cout << "Tamanho: " << fileSize << endl; + // cout << "Tamanho: " << fileSize << endl; sendProtocol.reset(); if(hasEnoughSpace(fileSize)) { sendProtocol.setData(vector<BYTE>(1,(BYTE)0), OK); @@ -89,7 +89,6 @@ int main(){ } receiveProtocol.reset(); receiveProtocol.receive(sockt,DATA,SLIDING,true); - cout <<"conteudo: "<< receiveProtocol.getDataAsString()<<endl; writeFile(getWorkingPath()+"/"+args,receiveProtocol.getData()); sendProtocol.reset(); receiveProtocol.reset(); diff --git a/dirFunctions.cpp b/dirFunctions.cpp index f2b5153a4a5f3dc860e84f25bdfea783eaf19d6d..845835a9a59367170f7d2d3c3ae661caef4e6810 100644 --- a/dirFunctions.cpp +++ b/dirFunctions.cpp @@ -53,7 +53,7 @@ bool hasEnoughSpace(int size){ string path = getWorkingPath(); statvfs(path.c_str(), &fsData); long long freeSpace = fsData.f_bsize * fsData.f_bfree; - cout << "freeSpace: " << freeSpace << "fsData: " << fsData.f_bsize << "\t" << fsData.f_bfree << endl; + // cout << "freeSpace: " << freeSpace << "fsData: " << fsData.f_bsize << "\t" << fsData.f_bfree << endl; return (freeSpace > size); }