#pragma once #include #include #include #include #include #include #include #include #if defined(__linux__) #include #include "linuxfixes.h" #else #include #include #endif namespace Utils { inline std::vector Split(const std::string& String, const std::string& delimiter) { std::vector Val; size_t pos; std::string token, s = String; while ((pos = s.find(delimiter)) != std::string::npos) { token = s.substr(0, pos); if (!token.empty()) Val.push_back(token); s.erase(0, pos + delimiter.length()); } if (!s.empty()) Val.push_back(s); return Val; }; template inline std::vector PrependHeader(const T& data) { std::vector size_buffer(4); uint32_t len = data.size(); std::memcpy(size_buffer.data(), &len, 4); std::vector buffer; buffer.reserve(size_buffer.size() + data.size()); buffer.insert(buffer.begin(), size_buffer.begin(), size_buffer.end()); buffer.insert(buffer.end(), data.begin(), data.end()); return buffer; } inline uint32_t RecvHeader(SOCKET socket) { std::array header_buffer {}; auto n = recv(socket, reinterpret_cast(header_buffer.data()), header_buffer.size(), MSG_WAITALL); if (n < 0) { throw std::runtime_error(std::string("recv() of header failed: ") + std::strerror(errno)); } else if (n == 0) { throw std::runtime_error("Game disconnected"); } return *reinterpret_cast(header_buffer.data()); } /// Throws!!! inline void ReceiveFromGame(SOCKET socket, std::vector& out_data) { auto header = RecvHeader(socket); out_data.resize(header); auto n = recv(socket, reinterpret_cast(out_data.data()), out_data.size(), MSG_WAITALL); if (n < 0) { throw std::runtime_error(std::string("recv() of data failed: ") + std::strerror(errno)); } else if (n == 0) { throw std::runtime_error("Game disconnected"); } } };