diff --git a/Message.cpp b/Message.cpp index e979626350b4e05cf9f260bee4fd835f6fc92ea7..70721303f56e8b6f947a812be00cfe916ba7b65d 100644 --- a/Message.cpp +++ b/Message.cpp @@ -1,4 +1,5 @@ #include "Message.h" +#include <bitset> #include "definitions.h" BYTE Message::calcParity() { @@ -16,6 +17,22 @@ bool Message::checkParity() { return (parity == this->header.c_ctrl.parity); } +vector<int> Message::getBitFieldsAsInt(){ + vector<int> bits; + // bitset<8> begin(messages[i].header.i_ctrl.begin); + // bitset<6> size(messages[i].header.i_ctrl.size); + // bitset<6> sequence(messages[i].header.i_ctrl.sequence); + // bitset<4> type(messages[i].header.i_ctrl.type); + // bitset<8> parity(messages[i].header.i_ctrl.parity); + bits.push_back((int)bitset<8>(header.i_ctrl.begin).to_ulong()); + bits.push_back((int)bitset<6>(header.i_ctrl.size).to_ulong()); + bits.push_back((int)bitset<6>(header.i_ctrl.sequence).to_ulong()); + bits.push_back((int)bitset<4>(header.i_ctrl.type).to_ulong()); + bits.push_back((int)bitset<8>(header.i_ctrl.parity).to_ulong()); + return bits; + +} + string Message::getSendData() { calcParity(); string s(data.begin(), data.end()); @@ -39,5 +56,5 @@ string Message::getSendData() { } Message::Message() { - this->header.c_ctrl.begin = BEGIN; + this->header.i_ctrl.begin = BEGIN; } diff --git a/Message.h b/Message.h index 071f1956829095c0fc3a72bef1c21ae6db2494c4..99c8b433fa38a8a6ac79fafe5cc08fbcd8141355 100644 --- a/Message.h +++ b/Message.h @@ -10,6 +10,7 @@ public: BYTE calcParity(); bool checkParity(); string getSendData(); + vector<int> getBitFieldsAsInt(); Message(); }; diff --git a/Protocol.cpp b/Protocol.cpp index ab019cfc6772c152c80f8c0f40bd3b848e2e6b9d..3b77f03f49089530ca01b9891b7beceabe97bd40 100644 --- a/Protocol.cpp +++ b/Protocol.cpp @@ -1,4 +1,5 @@ #include <sys/socket.h> +#include <bitset> #include "Protocol.h" #include "definitions.h" @@ -11,9 +12,23 @@ void Protocol::setMessages(vector<Message> messages){ } bool Protocol::sendMessages(int socket, int window) { + //FIXME: seqType char is wrong, could be because of how sequence is being set for(int i=0; i < messages.size(); ++i) { - string data = messages[i].getSendData(); - send(socket, data.c_str(), messages[i].header.i_ctrl.size, 0); + vector<BYTE> msg; + msg.push_back(messages[i].header.c_ctrl.begin); + cout << "vector begin: "<< bitset<8>(msg[0]) << endl; + cout << "sizeSeq: " << bitset<8>(messages[i].header.c_ctrl.sizeSeq) << endl; + cout << "seqType: " << bitset<8>(messages[i].header.c_ctrl.seqType) << endl; + msg.push_back(messages[i].header.c_ctrl.sizeSeq); + cout << "vector sizeSeq: "<< bitset<8>(msg[1]) << endl; + msg.push_back(messages[i].header.c_ctrl.seqType); + msg.insert(msg.end(), messages[i].data.begin(), messages[i].data.end()); + msg.push_back(messages[i].header.c_ctrl.parity); + char* data = reinterpret_cast<char*> (msg.data()); + cout << "msg size: " << bitset<6>(messages[i].header.i_ctrl.size) << endl; + cout << "pointer begin: "<< bitset<8>(data[0]) << "|\t"; + cout << "msg isize: " << messages[i].getBitFieldsAsInt()[1] << endl; + send(socket, data, messages[i].getBitFieldsAsInt()[1]+4, 0); } return true; } @@ -35,9 +50,8 @@ string Protocol::getDataAsString(){ void Protocol::setData(vector<BYTE> data, int type){ vector<BYTE>::const_iterator first, last; int i; - for (i=0; i <= data.size()-MAXSIZE; i+=MAXSIZE){ - Message msg; - msg.header.i_ctrl.begin = BEGIN; + for (i=0; i <= ((int)data.size())-MAXSIZE; i+=MAXSIZE){ + Message msg = Message(); msg.header.i_ctrl.size = MAXSIZE; msg.header.i_ctrl.sequence = messages.size()%(MAXSIZE+1); msg.header.i_ctrl.type = type; @@ -45,15 +59,16 @@ void Protocol::setData(vector<BYTE> data, int type){ last = data.begin()+i+MAXSIZE+1; vector<BYTE> subvector(first, last); msg.data = subvector; - //TODO: Set parity + msg.calcParity(); messages.push_back(msg); } if(i < data.size()){ - Message msg; - msg.header.i_ctrl.begin = BEGIN; + cout << "entrou if"<< endl; + Message msg = Message(); msg.header.i_ctrl.sequence = messages.size()%(MAXSIZE+1); msg.header.i_ctrl.type = type; - int size = data.size()-i; + int size = ((int)data.size())-i; + cout << "real size " << size<<endl; first = data.begin()+i; last = data.begin()+size+1; vector<BYTE> subvector(first, last); @@ -62,16 +77,18 @@ void Protocol::setData(vector<BYTE> data, int type){ size = MINSIZE; msg.data.insert(msg.data.begin(), MINSIZE-size, 0x0); } + cout << "modified size " << size<<endl; msg.header.i_ctrl.size = size; - //TODO: Set parity + msg.calcParity(); messages.push_back(msg); } } int Protocol::recvMessage(int sockt){ BYTE dataRec[MAXSIZE+4]; - recv(sockt, dataRec, MAXSIZE, 0); - cout << dataRec[0] << dataRec[1] << dataRec[2] << "|\t"; + int r = recv(sockt, dataRec, MAXSIZE+4, 0); + cout << "recv response: " << r << endl; + cout << bitset<8>(dataRec[0]) << bitset<8>(dataRec[1]) << bitset<8>(dataRec[2]) << "|\t"; Message msg; msg.header.c_ctrl.begin = dataRec[0]; if(msg.header.i_ctrl.begin != BEGIN){ @@ -83,7 +100,9 @@ int Protocol::recvMessage(int sockt){ return SEQ_MISS; } msg.header.c_ctrl.parity = dataRec[3+msg.header.i_ctrl.size]; - // TODO: Check parity + if(!msg.checkParity()){ + return INCONSISTENT; + } if(msg.header.i_ctrl.type == ENDTX){ return ENDTX; } diff --git a/client.cpp b/client.cpp index 3cdf3f0c8fa48f7f58ab7f74afe1bd61dbc18b7d..7b3bbf37eb6044ae55fa689c9bba85df80cfb6da 100644 --- a/client.cpp +++ b/client.cpp @@ -32,9 +32,7 @@ int main(){ //TODO }else if(command == "lsr"){ Message msg = Message(); - msg.header.i_ctrl.type = LS; - msg.data = vector<BYTE>(line.begin(), line.end()); - protocol.addMessage(msg); + protocol.setData(vector<BYTE>(line.begin(), line.end()), LS); protocol.sendMessages(sockt, WAIT_STOP); // TODO: imprimir resposta }else if(command == "put"){ diff --git a/definitions.h b/definitions.h index 2fb9e0a39bc5f205a556090951a9b74946b8ac3f..cab7dad5aa1eb89057910753c99809acacc7ab03 100644 --- a/definitions.h +++ b/definitions.h @@ -35,9 +35,9 @@ using namespace std; #define SLIDING 3 //Values of data for ERROR messages -#define DIR_ERR '0' -#define PERM_ERR '1' -#define SPACE_ERR '2' +#define DIR_ERR '0' //Nonexistent Directory +#define PERM_ERR '1' //Permission denied +#define SPACE_ERR '2' //File size bigger than disk free space size //recvMessage errors #define NOISE -1