aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authoralpine <[email protected]>2020-06-04 16:13:19 +0200
committeralpine <[email protected]>2020-06-04 16:13:19 +0200
commit28f66dee8a9fe49aadb5c1d67de48d9232363963 (patch)
tree00f6bfd0c2120d005c833301830d167b0753feb3 /server
downloadloader-28f66dee8a9fe49aadb5c1d67de48d9232363963.tar.xz
loader-28f66dee8a9fe49aadb5c1d67de48d9232363963.zip
Initial commit
Diffstat (limited to 'server')
-rw-r--r--server/CMakeLists.txt15
-rw-r--r--server/src/include.h41
-rw-r--r--server/src/main.cpp14
-rw-r--r--server/src/server/packet.h10
-rw-r--r--server/src/server/server.cpp52
-rw-r--r--server/src/server/server.h12
-rw-r--r--server/src/server/ssl.h1
-rw-r--r--server/src/util/commands.h21
-rw-r--r--server/src/util/events.h24
-rw-r--r--server/src/util/io.cpp41
-rw-r--r--server/src/util/io.h8
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