diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8e24b65 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +cmake-build-debug diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..844d591 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.6) +project(frnetlib) + +include_directories(include) +set(CMAKE_CXX_STANDARD 11) + +set(SOURCE_FILES main.cpp src/TcpSocket.cpp include/TcpSocket.h src/TcpListener.cpp include/TcpListener.h src/Socket.cpp include/Socket.h src/Packet.cpp include/Packet.h include/NetworkEncoding.h) +add_executable(frnetlib ${SOURCE_FILES}) \ No newline at end of file diff --git a/include/NetworkEncoding.h b/include/NetworkEncoding.h new file mode 100644 index 0000000..9184b2a --- /dev/null +++ b/include/NetworkEncoding.h @@ -0,0 +1,51 @@ +// +// Created by fred on 06/12/16. +// + +#ifndef FRNETLIB_NETWORKENCODING_H +#define FRNETLIB_NETWORKENCODING_H + +#include +#include + +#define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32)) +#define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32)) + +inline float htonf(float val) +{ + uint32_t ret; + memcpy(&ret, &val, sizeof(ret)); + ret = htonl(ret); + memcpy(&val, &ret, sizeof(val)); + return val; +} + +inline float ntohf(float val) +{ + uint32_t ret; + memcpy(&ret, &val, sizeof(ret)); + ret = ntohl(ret); + memcpy(&val, &ret, sizeof(val)); + return val; +} + +inline double htond(double val) +{ + uint64_t ret; + memcpy(&ret, &val, sizeof(ret)); + ret = htonll(ret); + memcpy(&val, &ret, sizeof(val)); + return val; +} + +inline double ntohd(double val) +{ + uint64_t ret; + memcpy(&ret, &val, sizeof(ret)); + ret = ntohll(ret); + memcpy(&val, &ret, sizeof(val)); + return val; +} + + +#endif //FRNETLIB_NETWORKENCODING_H diff --git a/include/Packet.h b/include/Packet.h new file mode 100644 index 0000000..0c2db58 --- /dev/null +++ b/include/Packet.h @@ -0,0 +1,139 @@ +// +// Created by fred on 06/12/16. +// + +#ifndef FRNETLIB_PACKET_H +#define FRNETLIB_PACKET_H +#include +#include +#include +#include "NetworkEncoding.h" + +class Packet +{ +public: + /*! + * Gets the data added to the packet + * + * @return A string containing all of the data added to the packet + */ + inline const std::string &construct_packet() + { + return buffer; + } + + /* + * Adds a 16bit variable to the packet + */ + inline Packet &operator<<(uint16_t var) + { + buffer.resize(buffer.size() + sizeof(var)); + var = htons(var); + memcpy(&buffer[buffer.size() - sizeof(var)], &var, sizeof(var)); + return *this; + } + + /* + * Extracts a 16bit variable from the packet + */ + inline Packet &operator>>(uint16_t &var) + { + memcpy(&var, &buffer[0], sizeof(var)); + buffer.erase(0, sizeof(var)); + var = ntohs(var); + return *this; + } + + /* + * Adds a 32bit variable to the packet + */ + inline Packet &operator<<(uint32_t var) + { + buffer.resize(buffer.size() + sizeof(var)); + var = htonl(var); + memcpy(&buffer[buffer.size() - sizeof(var)], &var, sizeof(var)); + return *this; + } + + /* + * Extracts a 32bit variable from the packet + */ + inline Packet &operator>>(uint32_t &var) + { + memcpy(&var, &buffer[0], sizeof(var)); + buffer.erase(0, sizeof(var)); + var = ntohl(var); + return *this; + } + + /* + * Adds a 64bit variable to the packet + */ + inline Packet &operator<<(uint64_t var) + { + buffer.resize(buffer.size() + sizeof(var)); + var = htonll(var); + memcpy(&buffer[buffer.size() - sizeof(var)], &var, sizeof(var)); + return *this; + } + + /* + * Extracts a 64bit variable from the packet + */ + inline Packet &operator>>(uint64_t &var) + { + memcpy(&var, &buffer[0], sizeof(var)); + buffer.erase(0, sizeof(var)); + var = ntohll(var); + return *this; + } + + /* + * Adds a float variable to the packet + */ + inline Packet &operator<<(float var) + { + buffer.resize(buffer.size() + sizeof(var)); + var = htonf(var); + memcpy(&buffer[buffer.size() - sizeof(var)], &var, sizeof(var)); + return *this; + } + + /* + * Extracts a float variable from the packet + */ + inline Packet &operator>>(float &var) + { + memcpy(&var, &buffer[0], sizeof(var)); + buffer.erase(0, sizeof(var)); + var = ntohf(var); + return *this; + } + + /* + * Adds a double variable to the packet + */ + inline Packet &operator<<(double var) + { + buffer.resize(buffer.size() + sizeof(var)); + var = htond(var); + memcpy(&buffer[buffer.size() - sizeof(var)], &var, sizeof(var)); + return *this; + } + + /* + * Extracts a double variable from the packet + */ + inline Packet &operator>>(double &var) + { + memcpy(&var, &buffer[0], sizeof(var)); + buffer.erase(0, sizeof(var)); + var = ntohd(var); + return *this; + } +private: + std::string buffer; //Packet data buffer +}; + + +#endif //FRNETLIB_PACKET_H diff --git a/include/Socket.h b/include/Socket.h new file mode 100644 index 0000000..068e1e3 --- /dev/null +++ b/include/Socket.h @@ -0,0 +1,17 @@ +// +// Created by fred on 06/12/16. +// + +#ifndef FRNETLIB_SOCKET_H +#define FRNETLIB_SOCKET_H + + +class Socket +{ +public: + +private: +}; + + +#endif //FRNETLIB_SOCKET_H diff --git a/include/TcpListener.h b/include/TcpListener.h new file mode 100644 index 0000000..57a617a --- /dev/null +++ b/include/TcpListener.h @@ -0,0 +1,15 @@ +// +// Created by fred on 06/12/16. +// + +#ifndef FRNETLIB_TCPLISTENER_H +#define FRNETLIB_TCPLISTENER_H + + +class TcpListener +{ + +}; + + +#endif //FRNETLIB_TCPLISTENER_H diff --git a/include/TcpSocket.h b/include/TcpSocket.h new file mode 100644 index 0000000..4af2928 --- /dev/null +++ b/include/TcpSocket.h @@ -0,0 +1,17 @@ +// +// Created by fred on 06/12/16. +// + +#ifndef FRNETLIB_TCPSOCKET_H +#define FRNETLIB_TCPSOCKET_H + +namespace fr +{ + class TcpSocket + { + + }; +} + + +#endif //FRNETLIB_TCPSOCKET_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..ea2d687 --- /dev/null +++ b/main.cpp @@ -0,0 +1,19 @@ +#include +#include + +int main() +{ + Packet packet; + packet << (uint16_t)15000 << (uint16_t)200 << (uint32_t)9299221 << (uint64_t)9223372036854775807 << (float)1.22 << (double)192.212; + std::cout << packet.construct_packet() << std::endl; + + uint16_t result, result2; + uint32_t result3; + uint64_t result4; + float result5; + double result6; + packet >> result >> result2 >> result3 >> result4 >> result5 >> result6; + + std::cout << result << ", " << result2 << ", " << result3 << ", " << result4 << ", " << result5 << ", " << result6 << std::endl; + return 0; +} \ No newline at end of file diff --git a/src/Packet.cpp b/src/Packet.cpp new file mode 100644 index 0000000..d34ee26 --- /dev/null +++ b/src/Packet.cpp @@ -0,0 +1,5 @@ +// +// Created by fred on 06/12/16. +// + +#include "Packet.h" diff --git a/src/Socket.cpp b/src/Socket.cpp new file mode 100644 index 0000000..e5d7c98 --- /dev/null +++ b/src/Socket.cpp @@ -0,0 +1,5 @@ +// +// Created by fred on 06/12/16. +// + +#include "Socket.h" diff --git a/src/TcpListener.cpp b/src/TcpListener.cpp new file mode 100644 index 0000000..af3be94 --- /dev/null +++ b/src/TcpListener.cpp @@ -0,0 +1,5 @@ +// +// Created by fred on 06/12/16. +// + +#include "TcpListener.h" diff --git a/src/TcpSocket.cpp b/src/TcpSocket.cpp new file mode 100644 index 0000000..f1ba989 --- /dev/null +++ b/src/TcpSocket.cpp @@ -0,0 +1,10 @@ +// +// Created by fred on 06/12/16. +// + +#include "TcpSocket.h" + +namespace fr +{ + +} \ No newline at end of file