Skip to content
Snippets Groups Projects
Commit 16a56139 authored by Israel Barreto Sant'Anna's avatar Israel Barreto Sant'Anna
Browse files

Put command working on server

parent 334b290d
Branches putServer
No related tags found
1 merge request!1Lento
......@@ -27,7 +27,7 @@ bool Protocol::sendMessages(int socket) {
}
bool Protocol::sendMessage(int socket, int index) {
cout << "message: " << 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,7 +88,7 @@ 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 << bitset<8>(dataRec[0]) << "|" << bitset<8>(dataRec[1]) << "|" << bitset<8>(dataRec[2]) << "|" << bitset<8>(dataRec[3]) << "|\t";
cout << "begin: "<< bitset<8>(dataRec[0]) <<endl;
cout << "recv response: " << r << endl;
if(dataRec[0] != BEGIN){
return NOISE;
......@@ -99,7 +99,6 @@ int Protocol::recvMessage(int sockt){
int dataSize = size < MINSIZE ? MINSIZE : size;
msg.setBitFields(dataRec[0], dataRec[1], dataRec[2], dataRec[dataSize+3]);
cout << "Sequence:" << msg.sequence.to_ulong() << "\t";
BYTE msgData[size];
memcpy(msgData,dataRec+3,size);
msg.data.insert(msg.data.end(), msgData, msgData+size);
......@@ -107,6 +106,7 @@ int Protocol::recvMessage(int sockt){
messages.push_back(msg);
cout << "Tipo:" << (int)msg.type.to_ulong() << endl;
cout <<"message received: "<< msg<<endl;
if(!msg.checkParity()){
return INCONSISTENT;
}
......@@ -155,13 +155,6 @@ void Protocol::transmit(int sockt, int window){
}
}
response.reset();
// }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 {
//TODO: treat error
}
......@@ -186,58 +179,36 @@ 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;
if(status == NOISE){
continue;
} else if(status == type) {
if(messages.back().sequence.to_ulong() != nextSequence){
if(!messages.empty() && (messages.back().sequence.to_ulong() != nextSequence)){
messages.pop_back();
response.reset();
vector<BYTE> val(1,(BYTE)nextSequence);
response.setData(val, NACK);
shouldSend = true;
} else if(window == WAIT_STOP || ((nextSequence % SLIDING) == 0)) {
} else {
if(window == WAIT_STOP || ((nextSequence % SLIDING) == 0)) {
response.reset();
vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong());
response.setData(val, ACK);
shouldSend = true;
}
nextSequence = (messages.back().sequence.to_ulong()+1)%(MAXSIZE+1);
} else {
//TODO: treat something?
}
} else if(status == ERROR) {
string str(messages.back().data.begin(), messages.back().data.end());
cout << "ERROR: " << getDataAsString() << endl;
cout << "ERROR: " << messages.back().getDataAsString() << endl;
return -1;
}
// else if(messages.back().sequence.to_ulong() != nextSequence){
// response.reset();
// vector<BYTE> val(1,(BYTE)nextSequence);
// response.setData(val, NACK);
// shouldSend = true;
// }
// else if(status == OUTPUT) {
// cout << messages.back().getDataAsString();
//
// frame.push_back(messages.size());
//
// response.reset();
// vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong());
// response.setData(val, ACK);
// nextSequence = (messages.back().sequence.to_ulong()+1)%(MAXSIZE+1);
// }else if(status == ERROR){
// string str(messages.back().data.begin(), messages.back().data.end());
// cout << "ERROR: " << getDataAsString() << endl;
// break;
// }else if(status == INCONSISTENT){
// response.reset();
// vector<BYTE> val(1,(BYTE)nextSequence);
// response.setData(val, NACK);
// shouldSend = true;
// }else{
// //TODO: treat error
// break;
// }
// shouldSend = shouldSend || (frame.size()%window == 0);
}while(status != end);
if(dataEndable){
response.reset();
vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong());
response.setData(val, ACK);
response.sendMessages(sockt);
}
return 0;
}
......
......@@ -16,7 +16,7 @@ using namespace std;
//Delimiter indicating beginning of a message
#define BEGIN 0x7E
//Socket device
#define DEVICE "lo"
#define DEVICE "enp8s2"
//Message types
#define NACK 0
#define ACK 1
......
#include <iostream>
#include <fstream>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <vector>
#include <stdio.h> //popen
#include <sys/statvfs.h>
using namespace std;
......@@ -28,3 +30,28 @@ string ls(string args){
pclose(lsOut);
return output;
}
string getWorkingPath(){
char temp[1024];
return (getcwd(temp, 1024) ? string(temp) : string(""));
}
bool hasEnoughSpace(int size){
struct statvfs fsData;
string path = getWorkingPath();
statvfs(path.c_str(), &fsData);
int freeSpace = fsData.f_bsize * fsData.f_bfree;
return (freeSpace > size);
}
void writeFile(string path, vector<BYTE>data){
cout << "path: "<< path<<endl;
string strData(data.begin(), data.end());
ofstream file(path);
if (file.is_open()){
file << strData;
file.close();
}
else cout << "Unable to open file";
}
......@@ -9,4 +9,10 @@ void cd(string path);
string ls(string path);
bool hasEnoughSpace(int size);
string getWorkingPath();
void writeFile(string path, vector<BYTE>data);
#endif
\ No newline at end of file
......@@ -18,8 +18,7 @@ int main(){
if(status == CD){
cout << "Recebeu CD\n";
cd(receiveProtocol.getDataAsString());
vector<BYTE> val(1,(BYTE)0);
sendProtocol.setData(val, OK);
sendProtocol.setData(vector<BYTE>(1,(BYTE)0), OK);
sendProtocol.sendMessage(sockt,0);
}else if(status == LS){
cout << "protocol data: " << receiveProtocol.getDataAsString() << endl;
......@@ -29,9 +28,34 @@ int main(){
sendProtocol.setData(vector<BYTE>(output.begin(), output.end()), OUTPUT);
sendProtocol.transmit(sockt, WAIT_STOP);
}else if(status == PUT){
//TODO
string fileName = receiveProtocol.getDataAsString();
cout << "fileName: " << fileName <<endl;
sendProtocol.setData(vector<BYTE>(1,(BYTE)0), OK);
sendProtocol.sendMessage(sockt,0);
receiveProtocol.reset();
receiveProtocol.receive(sockt,SIZE,WAIT_STOP,false);
cout << "fileSize: " << receiveProtocol.getDataAsString() <<endl;
int fileSize = stoi(receiveProtocol.getDataAsString());
sendProtocol.reset();
if(hasEnoughSpace(fileSize)){
sendProtocol.setData(vector<BYTE>(1,(BYTE)0), OK);
sendProtocol.sendMessage(sockt,0);
}else{
sendProtocol.setData(vector<BYTE>(1,(BYTE)SPACE_ERR), ERROR);
sendProtocol.sendMessage(sockt,0);
}
receiveProtocol.reset();
receiveProtocol.receive(sockt,DATA,SLIDING,true);
cout <<"conteudo: "<< receiveProtocol.getDataAsString()<<endl;
writeFile(getWorkingPath()+"/"+fileName,receiveProtocol.getData());
}else if(status == GET){
//TODO
}else if(status == ENDTX){
sendProtocol.reset();
vector<BYTE> val(1,(BYTE)receiveProtocol.getMessages().back().sequence.to_ulong());
sendProtocol.setData(val, ACK);
sendProtocol.sendMessages(sockt);
}
}catch(char const* strException){
cout << "Erro:" <<strException <<endl;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment