56 lines
1.3 KiB
C++
56 lines
1.3 KiB
C++
#pragma once
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
#include <thread>
|
|
#include <mutex>
|
|
#include <openssl/ssl.h>
|
|
#include "Protocol.hpp"
|
|
#include "Database.hpp"
|
|
#include "SessionManager.hpp"
|
|
|
|
struct ClientConnection {
|
|
int fd;
|
|
SSL* ssl;
|
|
uint64_t session_id;
|
|
std::string username;
|
|
};
|
|
|
|
struct ShardInfo {
|
|
std::string shard_id;
|
|
int max_capacity;
|
|
int current_load;
|
|
};
|
|
|
|
class Server {
|
|
public:
|
|
Server(const std::string& config_file);
|
|
~Server();
|
|
|
|
void run();
|
|
void stop();
|
|
|
|
private:
|
|
void initTLS();
|
|
void setupListener(int port);
|
|
void epollLoop();
|
|
void handleClientEvent(int fd);
|
|
void readPacket(ClientConnection* conn);
|
|
void processPacket(ClientConnection* conn, const PacketHeader& header, const std::vector<char>& payload);
|
|
void sendPacket(ClientConnection* conn, uint16_t opcode, uint64_t request_id, uint64_t session_id, const std::vector<char>& payload);
|
|
ShardInfo selectShard();
|
|
std::string generateSalt(size_t length = 16);
|
|
std::string hashArgon2(const std::string& input, const std::string& salt);
|
|
|
|
int listen_fd_;
|
|
SSL_CTX* ssl_ctx_;
|
|
bool running_;
|
|
int epoll_fd_;
|
|
|
|
Database db_;
|
|
SessionManager sessionManager_;
|
|
std::mutex conn_mutex_;
|
|
std::unordered_map<int, ClientConnection*> clients_;
|
|
std::vector<ShardInfo> shards_;
|
|
};
|