From 15bb2e874c69a2c6149b106abb50de3c15530eb2 Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Mon, 7 Nov 2022 18:53:11 +0100 Subject: [PATCH] Connection and payload quite done --- Connection.cpp | 31 +++++++++++++++++++++++-------- Connection.h | 8 +++++--- Payload.cpp | 8 ++++++-- Payload.h | 9 ++++----- main.cpp | 16 +++++++++++++++- 5 files changed, 53 insertions(+), 19 deletions(-) diff --git a/Connection.cpp b/Connection.cpp index c0bb40b..654a21e 100644 --- a/Connection.cpp +++ b/Connection.cpp @@ -47,22 +47,37 @@ Connection::~Connection(){ close(fd); } -bool Connection::send(std::vector payloads){ +bool Connection::send(std::vector payloads, bool size){ + if(size){ + unsigned char _size = payloads.size(); + ::send(fd, &_size , sizeof(_size), 0); + } for (Payload& p : payloads) { ::send(fd, p.getData() , p.getSize(), 0); } return true; } +bool Connection::send(Payload payload, bool size){ + return send(std::vector{payload}, size); +} + Payload Connection::recv(){ Payload ret; - char temp[100]; - memset(temp, 0, 100); - ssize_t size; - while((size = ::recv(fd, temp, sizeof(temp), 0)) > 0){ - for(char& in: temp){ - ret.push_char(in); - } + + ssize_t size = 0, bytes; + std::vector received(100); + while((bytes = ::recv(fd, received.data() + size, 100, 0)) > 0){ + size += bytes; + received.resize(size+100); } + if(bytes == 0){ + received.shrink_to_fit(); + ret.setData(received); + return ret; + } + + //Error Handling + error = ErrorTypes::recv; return ret; } diff --git a/Connection.h b/Connection.h index 64c5cb6..2b5ee34 100644 --- a/Connection.h +++ b/Connection.h @@ -5,8 +5,6 @@ #include #include "Payload.h" -class Payload; - class Connection { private: @@ -18,6 +16,9 @@ private: socket_creation = 10, get_ip, connect, + + recv = 20, + send }error; void p_HandleError(); @@ -26,7 +27,8 @@ public: Connection(std::string server_ip, int port); ~Connection(); - bool send(std::vector payload); + bool send(std::vector payload, bool size); + bool send(Payload payload, bool size); Payload recv(); /** diff --git a/Payload.cpp b/Payload.cpp index 91bf955..bb3b31d 100644 --- a/Payload.cpp +++ b/Payload.cpp @@ -1,13 +1,17 @@ #include "Payload.h" -void Payload::push_char(char load){ +void Payload::push_char(unsigned char load){ Data.push_back(load); } -char* Payload::getData(){ +unsigned char* Payload::getData(){ return Data.data(); } +void Payload::setData(std::vector m_data){ + Data = m_data; +} + size_t Payload::getSize(){ return Data.size(); } diff --git a/Payload.h b/Payload.h index b19f22f..11e7998 100644 --- a/Payload.h +++ b/Payload.h @@ -7,15 +7,14 @@ class Payload { private: - std::vector Data; + std::vector Data; public: size_t getSize(); - char* getData(); + unsigned char* getData(); - void push_char(char); + void setData(std::vector); - Payload(); - virtual ~Payload(); + void push_char(unsigned char); }; #endif /* PAYLOAD_H */ diff --git a/main.cpp b/main.cpp index ac59ec4..d5412d8 100644 --- a/main.cpp +++ b/main.cpp @@ -1,8 +1,22 @@ #include "Connection.h" +#include "Payload.h" +#include int main(int argc, char *argv[]) { - Connection c("145.239.73.162", 25565); + Connection* c; + if(argc == 1){ + c = new Connection("145.239.73.162", 25565); + }else{ + c = new Connection(argv[1], atoi(argv[2])); + } + Payload p; + p.push_char(0xFE); + p.push_char(0x01); + p.push_char(0xFA); + c->send(p, true); + Payload response = c->recv(); + std::cout << response.getData() << std::endl; return 0; }