Skip to content
Snippets Groups Projects
Commit 9ad40f1c authored by Vytor Calixto's avatar Vytor Calixto :space_invader:
Browse files

Added dataToInt function

parent b9cee061
Branches
No related tags found
1 merge request!1Lento
...@@ -67,27 +67,10 @@ int Message::getMessageSize(){ ...@@ -67,27 +67,10 @@ int Message::getMessageSize(){
return size.to_ulong()+4; return size.to_ulong()+4;
} }
// string Message::getSendData() { int Message::dataToInt() {
// calcParity(); string str(data.begin(), data.end());
// string s(data.begin(), data.end()); return stoi(str);
// int size = data.size(); }
// //TODO: quebrar em partes aqui? ou tem que quebrar no protocolo?
// header.i_ctrl.size = size;
// header.i_ctrl.sequence = 1;
// char *fill;
// if(size < 63) {
// fill = (char*) malloc((63-size)*sizeof(char));
// memset(fill, 0, (63-size)*sizeof(char));
// }
// string d;
// d += header.c_ctrl.begin;
// d += header.c_ctrl.sizeSeq;
// d += header.c_ctrl.seqType;
// d += s.c_str();
// d += fill;
// d += header.c_ctrl.parity;
// return d;
// }
ostream& operator<<(ostream& os, const Message& msg){ 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 << '|';
......
...@@ -14,12 +14,12 @@ public: ...@@ -14,12 +14,12 @@ public:
BYTE calcParity(); BYTE calcParity();
bool checkParity(); bool checkParity();
// string getSendData();
void setBitFields(BYTE begin, BYTE sizeSeq, BYTE seqType, BYTE parity); void setBitFields(BYTE begin, BYTE sizeSeq, BYTE seqType, BYTE parity);
vector<BYTE> getBitFieldsAsBytes(); vector<BYTE> getBitFieldsAsBytes();
vector<BYTE> getMessage(); vector<BYTE> getMessage();
char* getMessageAsCharPointer(); char* getMessageAsCharPointer();
int getMessageSize(); int getMessageSize();
int dataToInt();
Message(); Message();
}; };
......
...@@ -10,19 +10,29 @@ void Protocol::setMessages(vector<Message> messages){ ...@@ -10,19 +10,29 @@ void Protocol::setMessages(vector<Message> messages){
this->messages = messages; this->messages = messages;
} }
bool Protocol::sendMessages(int socket, int window) { bool Protocol::sendMessages(int socket) {
bool success = true;
for(int i=0; i < messages.size(); ++i) { for(int i=0; i < messages.size(); ++i) {
// cout << "message: " << messages[i] << endl; int status = sendMessage(socket, i);
vector<BYTE> message = messages[i].getMessage(); if(status < 0) {
success = false;
cout << "fail" << endl;
}
}
return success;
}
bool Protocol::sendMessage(int socket, int index) {
cout << "message: " << messages[index] << endl;
vector<BYTE> message = messages[index].getMessage();
unsigned char* msg = reinterpret_cast<unsigned char*> (message.data()); unsigned char* msg = reinterpret_cast<unsigned char*> (message.data());
// cout << "char* msg: "; // cout << "char* msg: ";
// for(int j=0;j<message.size();++j){ // for(int j=0;j<message.size();++j){
// cout << bitset<8>(msg[j]); // cout << bitset<8>(msg[j]);
// } // }
// cout <<endl; // cout <<endl;
send(socket, msg, messages[i].getMessageSize(), 0); int status = send(socket, msg, messages[index].getMessageSize(), 0);
} return (status >= 0);
return true;
} }
vector<BYTE> Protocol::getData(){ vector<BYTE> Protocol::getData(){
...@@ -78,17 +88,17 @@ int Protocol::recvMessage(int sockt){ ...@@ -78,17 +88,17 @@ int Protocol::recvMessage(int sockt){
BYTE dataRec[MAXSIZE+4]; BYTE dataRec[MAXSIZE+4];
int r = recv(sockt, dataRec, MAXSIZE+4, 0); int r = recv(sockt, dataRec, MAXSIZE+4, 0);
cout << bitset<8>(dataRec[0]) << "|" << bitset<8>(dataRec[1]) << "|" << bitset<8>(dataRec[2]) << "|" << bitset<8>(dataRec[3]) << "|\t"; cout << bitset<8>(dataRec[0]) << "|" << bitset<8>(dataRec[1]) << "|" << bitset<8>(dataRec[2]) << "|" << bitset<8>(dataRec[3]) << "|\t";
cout << "recv response: " << r << endl; // cout << "recv response: " << r << endl;
if(dataRec[0] != BEGIN){ if(dataRec[0] != BEGIN){
return NOISE; return NOISE;
} }
Message msg = Message(); Message msg = Message();
int size = (int)(dataRec[1]>>2); int size = (int)(dataRec[1]>>2);
cout << "Tamanho:" << size << "\t"; // cout << "Tamanho:" << size << "\t";
msg.setBitFields(dataRec[0], dataRec[1], dataRec[2], dataRec[size+3]); msg.setBitFields(dataRec[0], dataRec[1], dataRec[2], dataRec[size+3]);
cout << "Sequence:" << msg.sequence.to_ulong() << "\t"; // cout << "Sequence:" << msg.sequence.to_ulong() << "\t";
if(!messages.empty() && if(!receivedMessages.empty() &&
(msg.sequence.to_ulong() != ((messages.back().sequence.to_ulong()+1)%(MAXSIZE+1)))){ (msg.sequence.to_ulong() != ((receivedMessages.back().sequence.to_ulong()+1)%(MAXSIZE+1))) && (msg.sequence.to_ulong() != receivedMessages.back().sequence.to_ulong()) ){
return SEQ_MISS; return SEQ_MISS;
} }
if(!msg.checkParity()){ if(!msg.checkParity()){
...@@ -101,22 +111,52 @@ int Protocol::recvMessage(int sockt){ ...@@ -101,22 +111,52 @@ int Protocol::recvMessage(int sockt){
BYTE msgData[size]; BYTE msgData[size];
memcpy(msgData,dataRec+3,size); memcpy(msgData,dataRec+3,size);
msg.data.insert(msg.data.end(), msgData, msgData+size); msg.data.insert(msg.data.end(), msgData, msgData+size);
messages.push_back(msg); receivedMessages.push_back(msg);
cout << "Tipo:" << (int)msg.type.to_ulong() << endl; // cout << "Tipo:" << (int)msg.type.to_ulong() << endl;
return (int)msg.type.to_ulong(); return (int)msg.type.to_ulong();
} }
void Protocol::transmit(int sockt, int type, int window){ void Protocol::transmit(int sockt, int window){
int status; int status;
for(int i=0; i < messages.size(); ++i){ vector<int> frame;
//TODO: send part of output back int lastFramed = 0;
int messagesLeft = messages.size();
bool shouldSend = true;
while(messagesLeft > 0){
for(int j=0; j < window; ++j) {
frame.push_back(lastFramed++);
if(shouldSend) sendMessage(sockt, frame[j]);
}
// TODO: timeout
status = recvMessage(sockt); status = recvMessage(sockt);
if(!status){ cout << "transmit status:" << status << endl;
//TODO: send part of output back again shouldSend = true;
if(status == 0){
int nackIndex = stoi(getDataAsString());
for(int j=0; j < window; ++j) {
if(frame[j] < nackIndex) {
frame.erase(frame.begin() + j);
--messagesLeft;
}
}
}else if(status == 1){ }else if(status == 1){
//TODO: send another part of output back int ackIndex = stoi(getDataAsString());
for(int j=0; j < window; ++j) {
if(frame[j] <= ackIndex) {
frame.erase(frame.begin() + j);
--messagesLeft;
}
}
}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 { } else {
//TODO: send NACK back //TODO: treat error
shouldSend = false;
} }
} }
} }
......
...@@ -7,9 +7,11 @@ class Protocol{ ...@@ -7,9 +7,11 @@ class Protocol{
private: private:
vector<Message> messages; vector<Message> messages;
vector<Message> receivedMessages;
int timeout; int timeout;
public: public:
bool sendMessages(int socket, int window); bool sendMessages(int socket);
bool sendMessage(int socket, int index);
vector<Message> getMessages(); vector<Message> getMessages();
void setMessages(vector<Message> messages); void setMessages(vector<Message> messages);
vector<BYTE> getData(); vector<BYTE> getData();
...@@ -17,7 +19,7 @@ public: ...@@ -17,7 +19,7 @@ public:
string getDataAsString(); string getDataAsString();
int recvMessage(int sockt); int recvMessage(int sockt);
void addMessage(Message msg); void addMessage(Message msg);
void transmit(int sockt, int type, int window); void transmit(int sockt, int window);
void receive(int sockt, int type, int window); void receive(int sockt, int type, int window);
Protocol(); Protocol();
......
...@@ -31,17 +31,17 @@ int main(){ ...@@ -31,17 +31,17 @@ int main(){
}else if(command == "cdr"){ }else if(command == "cdr"){
args = line.substr(pos+1, line.size()); args = line.substr(pos+1, line.size());
protocol.setData(vector<BYTE>(args.begin(), args.end()), CD); protocol.setData(vector<BYTE>(args.begin(), args.end()), CD);
protocol.sendMessages(sockt, WAIT_STOP); protocol.transmit(sockt, WAIT_STOP);
}else if(command == "lsr"){ }else if(command == "lsr"){
Message msg = Message();
line.replace(line.find("lsr"), string("lsr").length(), "ls"); line.replace(line.find("lsr"), string("lsr").length(), "ls");
protocol.setData(vector<BYTE>(line.begin(), line.end()), LS); protocol.setData(vector<BYTE>(line.begin(), line.end()), LS);
protocol.sendMessages(sockt, WAIT_STOP); protocol.transmit(sockt, WAIT_STOP);
// TODO: imprimir resposta
}else if(command == "put"){ }else if(command == "put"){
//TODO protocol.setData(vector<BYTE>(line.begin(), line.end()), PUT);
protocol.transmit(sockt, WAIT_STOP);
}else if(command == "get"){ }else if(command == "get"){
protocol.setData(vector<BYTE>(line.begin(), line.end()), GET);
protocol.transmit(sockt, WAIT_STOP);
}else if(command == "help"){ }else if(command == "help"){
printCommandsList(); printCommandsList();
}else{ }else{
...@@ -53,24 +53,6 @@ int main(){ ...@@ -53,24 +53,6 @@ int main(){
}catch(out_of_range e){ }catch(out_of_range e){
cerr<<"Error: Esse comando requer argumentos."<<endl; 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){
// string output = ls(protocol.getDataAsString());
// //TODO: send output back
// }else if(status == PUT){
// //TODO
// }else if(status == GET){
// //TODO
// }
// }
} }
return 0; return 0;
} }
......
...@@ -19,9 +19,11 @@ int main(){ ...@@ -19,9 +19,11 @@ int main(){
cout << "Recebeu CD\n"; cout << "Recebeu CD\n";
cd(protocol.getDataAsString()); cd(protocol.getDataAsString());
}else if(status == LS){ }else if(status == LS){
cout << "Recebeu LS\n"; cout << protocol.getDataAsString() << endl;
string output = ls(protocol.getDataAsString()); string output = ls(protocol.getDataAsString());
//TODO: send output back cout << "LS:" << output << endl;
protocol.setData(vector<BYTE>(output.begin(), output.end()), OUTPUT);
protocol.sendMessages(sockt);
}else if(status == PUT){ }else if(status == PUT){
//TODO //TODO
}else if(status == GET){ }else if(status == GET){
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment