diff options
| author | alpine <[email protected]> | 2020-06-04 16:13:19 +0200 |
|---|---|---|
| committer | alpine <[email protected]> | 2020-06-04 16:13:19 +0200 |
| commit | 28f66dee8a9fe49aadb5c1d67de48d9232363963 (patch) | |
| tree | 00f6bfd0c2120d005c833301830d167b0753feb3 /server | |
| download | loader-28f66dee8a9fe49aadb5c1d67de48d9232363963.tar.xz loader-28f66dee8a9fe49aadb5c1d67de48d9232363963.zip | |
Initial commit
Diffstat (limited to 'server')
| -rw-r--r-- | server/CMakeLists.txt | 15 | ||||
| -rw-r--r-- | server/src/include.h | 41 | ||||
| -rw-r--r-- | server/src/main.cpp | 14 | ||||
| -rw-r--r-- | server/src/server/packet.h | 10 | ||||
| -rw-r--r-- | server/src/server/server.cpp | 52 | ||||
| -rw-r--r-- | server/src/server/server.h | 12 | ||||
| -rw-r--r-- | server/src/server/ssl.h | 1 | ||||
| -rw-r--r-- | server/src/util/commands.h | 21 | ||||
| -rw-r--r-- | server/src/util/events.h | 24 | ||||
| -rw-r--r-- | server/src/util/io.cpp | 41 | ||||
| -rw-r--r-- | server/src/util/io.h | 8 |
11 files changed, 239 insertions, 0 deletions
diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt new file mode 100644 index 0000000..0461d8b --- /dev/null +++ b/server/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.14) + +project(server) + +set(CMAKE_CXX_STANDARD 17) +set(source_dir "${PROJECT_SOURCE_DIR}/src") + +file(GLOB_RECURSE source_files "${source_dir}/*.cpp") +file(GLOB_RECURSE header_files "${source_dir}/*.h") + +add_executable( + server + ${source_files} + ${header_files} +)
\ No newline at end of file diff --git a/server/src/include.h b/server/src/include.h new file mode 100644 index 0000000..eb31336 --- /dev/null +++ b/server/src/include.h @@ -0,0 +1,41 @@ +#pragma once + +#include <algorithm> +#include <array> +#include <chrono> +#include <cstring> +#include <fstream> +#include <functional> +#include <iostream> +#include <memory> +#include <sstream> +#include <string> +#include <system_error> +#include <thread> +#include <vector> +#include <unordered_map> +#include <unordered_set> +#include <optional> +#include <map> +#include <random> +#include <list> +#include <utility> +#include <atomic> +#include <mutex> +#include <filesystem> + +#include <arpa/inet.h> +#include <netdb.h> +#include <netinet/in.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <unistd.h> + +#include <cpr/cpr.h> + +#include <spdlog/fmt/fmt.h> +#include <spdlog/spdlog.h> +#include <spdlog/sinks/basic_file_sink.h> +#include <spdlog/sinks/stdout_color_sinks.h> + +#include <openssl/ssl.h> diff --git a/server/src/main.cpp b/server/src/main.cpp new file mode 100644 index 0000000..f34c433 --- /dev/null +++ b/server/src/main.cpp @@ -0,0 +1,14 @@ +#include "include.h" +#include "util/io.h" +#include "util/commands.h" +#include "server/server.h" + +int main(int argc, char *argv[]) { + io::init(false); + + tcp::server server; + server.start("6666"); + server.start("8981"); + + std::cin.get(); +} diff --git a/server/src/server/packet.h b/server/src/server/packet.h new file mode 100644 index 0000000..02d90d1 --- /dev/null +++ b/server/src/server/packet.h @@ -0,0 +1,10 @@ +#pragma once + +namespace tcp { + constexpr uint8_t uid_len = 10; + + struct packet_t { + std::string message; + std::array<char, uid_len> uid; + } +} diff --git a/server/src/server/server.cpp b/server/src/server/server.cpp new file mode 100644 index 0000000..2f684e1 --- /dev/null +++ b/server/src/server/server.cpp @@ -0,0 +1,52 @@ +#include "../include.h" +#include "../util/io.h" +#include "server.h" + +bool tcp::server::start(const std::string_view port) { + io::logger->info("starting server on port {}...", port.data()); + + m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (m_socket < 0) { + io::logger->critical("failed to create socket."); + return false; + } + struct addrinfo hints, *addrinfo = nullptr; + + memset(&hints, 0, sizeof hints); + + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + hints.ai_flags = AI_PASSIVE; + + int ret = getaddrinfo(nullptr, port.data(), &hints, &addrinfo); + if (ret != 0) { + io::logger->critical("failed to get address info."); + close(m_socket); + return false; + } + + ret = bind(m_socket, addrinfo->ai_addr, addrinfo->ai_addrlen); + if (ret < 0) { + io::logger->critical("failed to bind port."); + close(m_socket); + return false; + } + io::logger->info("port bound."); + freeaddrinfo(addrinfo); + + ret = listen(m_socket, SOMAXCONN); + if (ret < 0) { + io::logger->critical("failed to listen on port {}.", port.data()); + close(m_socket); + return false; + } + io::logger->info("listening on {}.", port.data()); + + return true; +} + +void tcp::server::stop() { + io::logger->info("stopping server on port {}.", m_port); + close(m_socket); +}
\ No newline at end of file diff --git a/server/src/server/server.h b/server/src/server/server.h new file mode 100644 index 0000000..f848ae2 --- /dev/null +++ b/server/src/server/server.h @@ -0,0 +1,12 @@ +#pragma once + +namespace tcp { +class server { + int m_socket; + + public: + + bool start(const std::string_view port); + void stop(); +}; +}; // namespace tcp diff --git a/server/src/server/ssl.h b/server/src/server/ssl.h new file mode 100644 index 0000000..7b9637e --- /dev/null +++ b/server/src/server/ssl.h @@ -0,0 +1 @@ +#pragma once
\ No newline at end of file diff --git a/server/src/util/commands.h b/server/src/util/commands.h new file mode 100644 index 0000000..1e5ae0f --- /dev/null +++ b/server/src/util/commands.h @@ -0,0 +1,21 @@ +#pragma once + +class commands { + using func = std::function<void()>; + std::unordered_map<std::string_view, func> m_cmds; + + public: + bool parse_input(const std::string_view str) { + auto it = m_cmds.find(str); + if (it != m_cmds.end()) { + it->second(); + return true; + } + return false; + } + + void add(const std::string_view cmd, const func &cb) { + + m_cmds[cmd] = cb; + } +}; diff --git a/server/src/util/events.h b/server/src/util/events.h new file mode 100644 index 0000000..e6f053d --- /dev/null +++ b/server/src/util/events.h @@ -0,0 +1,24 @@ +#pragma once + +template <typename... Args> +class event { + using func_type = std::function<void(Args...)>; + + std::mutex event_lock; + std::list<func_type> m_funcs; + + public: + void add(const func_type& func) { + std::lock_guard<std::mutex> lock(event_lock); + + m_funcs.emplace_back(std::move(func)); + } + + void call(Args... params) { + std::lock_guard<std::mutex> lock(event_lock); + + for (auto& func : m_funcs) { + if (func) func(std::forward<Args>(params)...); + } + } +}; diff --git a/server/src/util/io.cpp b/server/src/util/io.cpp new file mode 100644 index 0000000..1f9bca6 --- /dev/null +++ b/server/src/util/io.cpp @@ -0,0 +1,41 @@ +#include "../include.h" +#include "io.h" + +std::shared_ptr<spdlog::logger> io::logger; + +void io::init(const bool &trunc) { + auto sink = + std::make_shared<spdlog::sinks::stdout_color_sink_mt>(); + sink->set_pattern("[%R][%^%l%$] %v"); + + auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("server.log", trunc); + + std::vector<spdlog::sink_ptr> log_sinks; + log_sinks.emplace_back(sink); + log_sinks.emplace_back(file_sink); + + logger = std::make_shared<spdlog::logger>("server", log_sinks.begin(), log_sinks.end()); + spdlog::register_logger(logger); + + spdlog::flush_every(std::chrono::seconds(1)); +} + +void io::read_file(const std::string_view name, std::vector<char> &out) { + std::ifstream file(name.data()); + if (!file.good()) { + io::logger->error("failed to load {}.", name.data()); + return; + } + + file.unsetf(std::ios::skipws); + + file.seekg(0, std::ios::end); + const size_t size = file.tellg(); + file.seekg(0, std::ios::beg); + + out.resize(size); + + file.read(out.data(), size); + + file.close(); +} diff --git a/server/src/util/io.h b/server/src/util/io.h new file mode 100644 index 0000000..437b465 --- /dev/null +++ b/server/src/util/io.h @@ -0,0 +1,8 @@ +#pragma once + +namespace io { +extern std::shared_ptr<spdlog::logger> logger; + +void init(const bool &trunc); +void read_file(const std::string_view name, std::vector<char> &out); +}; // namespace io |