From c9fb294709f78e04b5496ba1f8312d319f077b69 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Sat, 5 Dec 2015 19:28:35 -0200 Subject: [PATCH] Sending appropriate message --- Makefile | 8 ++++---- Message.cpp | 26 ++++++++++++++++++++++---- Protocol.cpp | 19 ++++++++++--------- client.cpp | 39 ++++++++++++++++++++------------------- server.cpp | 3 ++- 5 files changed, 58 insertions(+), 37 deletions(-) diff --git a/Makefile b/Makefile index a2a739a..b1472c1 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -CFLAGS= -w -g -Wall -O2 +CXXFLAGS= -w -g -Wall -O2 -std=c++11 CC=g++ OBJ=Protocol.o Message.o @@ -6,10 +6,10 @@ OBJ=Protocol.o Message.o all: cacoclient cacoserver %.o: %.cpp - $(CC) $(CFLAGS) $^ -c -o $@ + $(CC) $(CXXFLAGS) $^ -c -o $@ cacoclient: client.cpp $(OBJ) - $(CC) $(CFLAGS) $^ -o $@ + $(CC) $(CXXFLAGS) $^ -o $@ cacoserver: server.cpp $(OBJ) - $(CC) $(CFLAGS) $^ -o $@ + $(CC) $(CXXFLAGS) $^ -o $@ clean: rm -f *.o caco* diff --git a/Message.cpp b/Message.cpp index b2aaa19..4242225 100644 --- a/Message.cpp +++ b/Message.cpp @@ -20,26 +20,42 @@ bool Message::checkParity() { void Message::setBitFields(BYTE begin, BYTE sizeSeq, BYTE seqType, BYTE parity){ //if the size of val passed in the bitset constructor is greater than the bitset size, // only the least significant bits of val are taken into consideration. + // cout << "Input:\t" << bitset<8>(sizeSeq) << "\t" << bitset<8>(seqType); + // cout << "Set bitFields:\t"; this->begin = bitset<BEGIN_S>(begin); this->size = bitset<SIZE_S>(sizeSeq >> 2); + // cout << size << "\t"; this->sequence = bitset<SEQUENCE_S>((sizeSeq << 4) | (seqType >> 4)); + // cout << sequence << "\t"; this->type = bitset<TYPE_S>(seqType); + // cout << type << endl; this->parity = bitset<PARITY_S>(parity); } vector<BYTE> Message::getBitFieldsAsBytes(){ vector<BYTE> bitFields; bitFields.push_back((BYTE)begin.to_ulong()); - bitFields.push_back((BYTE)size.to_ulong()); - bitFields.push_back((BYTE)sequence.to_ulong()); - bitFields.push_back((BYTE)type.to_ulong()); + // bitFields.push_back((BYTE)size.to_ulong()); + // bitFields.push_back((BYTE)sequence.to_ulong()); + // bitFields.push_back((BYTE)type.to_ulong()); + string str = size.to_string(); + str += sequence.to_string(); + str += type.to_string(); + // cout << "str:" << str << "\t" << (BYTE)bitset<8>(str.substr(8,8)).to_ulong() << endl; + bitFields.push_back((BYTE)bitset<8>(str.substr(0,8)).to_ulong()); + bitFields.push_back((BYTE)bitset<8>(str.substr(8,8)).to_ulong()); bitFields.push_back((BYTE)parity.to_ulong()); return bitFields; } vector<BYTE> Message::getMessage(){ vector<BYTE> msg = getBitFieldsAsBytes(); - msg.insert(msg.end()-2, data.begin(), data.end()); + msg.insert(msg.end()-1, data.begin(), data.end()); + // cout << "getMessage:\n"; + // for(int i=0; i < msg.size(); ++i) { + // cout << bitset<8>(msg[i]); + // } + // cout<<endl; return msg; } @@ -75,10 +91,12 @@ int Message::getMessageSize(){ ostream& operator<<(ostream& os, const Message& msg){ os << '|' << msg.begin << '|' << msg.size << '|' << msg.sequence << '|' << msg.type << '|'; + // os << msg.begin << msg.size << msg.sequence << msg.type; for(int i=0; i<msg.data.size(); ++i){ os << bitset<8>(msg.data[i]); } os << '|' << msg.parity << '|'; + // os << msg.parity; return os; } diff --git a/Protocol.cpp b/Protocol.cpp index 9fa9699..1acf851 100644 --- a/Protocol.cpp +++ b/Protocol.cpp @@ -12,14 +12,14 @@ void Protocol::setMessages(vector<Message> messages){ bool Protocol::sendMessages(int socket, int window) { for(int i=0; i < messages.size(); ++i) { - cout << "message: " << messages[i] << endl; + // cout << "message: " << messages[i] << endl; vector<BYTE> message = messages[i].getMessage(); - char* msg = reinterpret_cast<char*> (message.data()); - cout << "char* msg: "; - for(int j=0;j<message.size();++j){ - cout << bitset<8>(msg[j]); - } - cout <<endl; + unsigned char* msg = reinterpret_cast<unsigned char*> (message.data()); + // cout << "char* msg: "; + // for(int j=0;j<message.size();++j){ + // cout << bitset<8>(msg[j]); + // } + // cout <<endl; send(socket, msg, messages[i].getMessageSize(), 0); } return true; @@ -77,15 +77,16 @@ void 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 << bitset<8>(dataRec[0]) << bitset<8>(dataRec[1]) << bitset<8>(dataRec[2]) << "|\t"; + cout << bitset<8>(dataRec[0]) << "|" << bitset<8>(dataRec[1]) << "|" << bitset<8>(dataRec[2]) << "|" << bitset<8>(dataRec[3]) << "|\t"; cout << "recv response: " << r << endl; if(dataRec[0] != BEGIN){ return NOISE; } Message msg = Message(); int size = (int)(dataRec[1]>>2); + cout << "Tamanho:" << size << "\t"; msg.setBitFields(dataRec[0], dataRec[1], dataRec[2], dataRec[size+3]); - cout << "Sequence:" << msg.sequence.to_ulong() << endl; + cout << "Sequence:" << msg.sequence.to_ulong() << "\t"; // FIXME: Erro na primeira mensagem de sequencialização // if(msg.sequence.to_ulong() != ((messages.back().sequence.to_ulong()+1)%(MAXSIZE+1))){ // return SEQ_MISS; diff --git a/client.cpp b/client.cpp index 1a3576a..e8eeb56 100644 --- a/client.cpp +++ b/client.cpp @@ -29,7 +29,9 @@ int main(){ }else if(command == "ls"){ cout << ls(line); }else if(command == "cdr"){ - //TODO + args = line.substr(pos+1, line.size()); + protocol.setData(vector<BYTE>(args.begin(), args.end()), CD); + protocol.sendMessages(sockt, WAIT_STOP); }else if(command == "lsr"){ Message msg = Message(); line.replace(line.find("lsr"), string("lsr").length(), "ls"); @@ -52,24 +54,23 @@ int main(){ cerr<<"Error: Esse comando requer argumentos."<<endl; } - int status = protocol.recvMessage(sockt); - cout << "Status: " << status << endl; - if(status > 0){ - if(status == ENDTX){ - protocol = Protocol(); - //TODO: send ACK - }else if(status == CD){ - cd(protocol.getDataAsString()); - }else if(status == LS){ - cout << "Recebeu LS\n"; - string output = ls(protocol.getDataAsString()); - //TODO: send output back - }else if(status == PUT){ - //TODO - }else if(status == GET){ - //TODO - } - } + // int status = protocol.recvMessage(sockt); + // cout << "Status: " << status << endl; + // if(status > 0){ + // if(status == ENDTX){ + // protocol = Protocol(); + // //TODO: send ACK + // }else if(status == CD){ + // cd(protocol.getDataAsString()); + // }else if(status == LS){ + // string output = ls(protocol.getDataAsString()); + // //TODO: send output back + // }else if(status == PUT){ + // //TODO + // }else if(status == GET){ + // //TODO + // } + // } } return 0; } diff --git a/server.cpp b/server.cpp index a3c177a..264c508 100644 --- a/server.cpp +++ b/server.cpp @@ -10,12 +10,13 @@ int main(){ while(true){ int status = protocol.recvMessage(sockt); cout << "status: " << status << endl; - cout << protocol.getDataAsString() << endl; + // cout << protocol.getDataAsString() << endl; if(status > 0){ if(status == ENDTX){ protocol = Protocol(); //TODO: send ACK }else if(status == CD){ + cout << "Recebeu CD\n"; cd(protocol.getDataAsString()); }else if(status == LS){ cout << "Recebeu LS\n"; -- GitLab