summaryrefslogtreecommitdiff
path: root/include/libsock/server
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-06-19 18:45:34 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-06-19 18:45:34 +0800
commitcad2569f10e6c0131e5e645ee76330c776b91547 (patch)
treef246b6a9799644c735228c6c5df2ece65e0d028d /include/libsock/server
parentb3a3e73aaefa39e052e53f9f42c6d0e2f7e1bb9b (diff)
fix!: share pointer
for details: https://stackoverflow.com/a/5548314
Diffstat (limited to 'include/libsock/server')
-rw-r--r--include/libsock/server/client.hpp10
-rw-r--r--include/libsock/server/clients.hpp11
-rw-r--r--include/libsock/server/server.hpp9
3 files changed, 17 insertions, 13 deletions
diff --git a/include/libsock/server/client.hpp b/include/libsock/server/client.hpp
index 1799f34..0579a38 100644
--- a/include/libsock/server/client.hpp
+++ b/include/libsock/server/client.hpp
@@ -1,6 +1,8 @@
#pragma once
#include "../types.hpp"
+#include "clients.hpp"
+#include "server.hpp"
#include <any>
#include <format>
#include <functional>
@@ -12,12 +14,6 @@
namespace LibSock {
namespace Server {
-class Server;
-class Clients;
-
-extern SP<Server> pServer;
-extern SP<Clients> pClients;
-
struct SRecvData {
std::string data;
const size_t size = 1024;
@@ -52,7 +48,7 @@ class Client {
bool isValid();
private:
- Client(SP<Server> server = SP<Server>(pServer), SP<Clients> clients = pClients, bool track = false, bool oneShot = true);
+ Client(SP<Server> server = pServer, SP<Clients> clients = pClients, bool track = false, bool oneShot = true);
WP<Client> self;
SP<LibSock::CFileDescriptor> m_sockfd;
diff --git a/include/libsock/server/clients.hpp b/include/libsock/server/clients.hpp
index ba0b40d..8eccbb7 100644
--- a/include/libsock/server/clients.hpp
+++ b/include/libsock/server/clients.hpp
@@ -3,6 +3,7 @@
#include "../types.hpp"
#include <any>
#include <functional>
+#include <memory>
#include <optional>
#include <string>
#include <thread>
@@ -17,9 +18,10 @@ struct SData {
std::string msg;
std::optional<WP<Client>> sender = std::nullopt;
};
-class Clients {
+
+class Clients : public std::enable_shared_from_this<Clients> {
public:
- Clients();
+ static SP<Clients> create();
~Clients();
WP<Client> newClient(std::optional<std::function<std::any(WP<Client>)>> cb = std::nullopt);
@@ -36,13 +38,16 @@ class Clients {
std::vector<SData> getDatas() const;
private:
+ Clients();
void broadcast(const SData &msg);
std::vector<std::pair<std::jthread, SP<Client>>> m_vClients;
std::vector<SData> m_vDatas;
+ SP<Clients> get();
+
friend class Client;
};
-
+inline SP<Clients> pClients;
} // namespace Server
} // namespace LibSock
diff --git a/include/libsock/server/server.hpp b/include/libsock/server/server.hpp
index 1b52e2f..225bdb0 100644
--- a/include/libsock/server/server.hpp
+++ b/include/libsock/server/server.hpp
@@ -1,24 +1,27 @@
#pragma once
#include "../types.hpp"
+#include <memory>
#include <mutex>
#include <netinet/in.h>
-#include <vector>
namespace LibSock {
namespace Server {
-class Server {
+class Server : public std::enable_shared_from_this<Server> {
public:
- Server(uint16_t port, bool reuseaddr = true, bool keepalive = false);
+ static SP<Server> create(uint16_t port, bool reuseaddr = true, bool keepalive = false);
~Server();
SP<LibSock::CFileDescriptor> getSocket() const;
private:
+ Server(uint16_t port, bool reuseaddr = true, bool keepalive = false);
SP<LibSock::CFileDescriptor> m_sockfd;
sockaddr_in m_addr;
uint16_t m_port;
+ SP<Server> get();
+
mutable std::mutex m_mutex;
};
inline SP<Server> pServer;