diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2025-06-19 18:45:34 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2025-06-19 18:45:34 +0800 |
| commit | cad2569f10e6c0131e5e645ee76330c776b91547 (patch) | |
| tree | f246b6a9799644c735228c6c5df2ece65e0d028d /include/libsock | |
| parent | b3a3e73aaefa39e052e53f9f42c6d0e2f7e1bb9b (diff) | |
fix!: share pointer
for details: https://stackoverflow.com/a/5548314
Diffstat (limited to 'include/libsock')
| -rw-r--r-- | include/libsock/server/client.hpp | 10 | ||||
| -rw-r--r-- | include/libsock/server/clients.hpp | 11 | ||||
| -rw-r--r-- | include/libsock/server/server.hpp | 9 |
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; |
