summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-06-22 16:14:17 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-06-22 16:14:17 +0800
commitb075eb7c98e45972b2ff79048cfde8f1469b00c7 (patch)
tree9958a14b1377a878cc4ba202dd4b25d2b7d3b9ac
parentb048a36cda2cf8359bf689c2e6825fc30d0277a5 (diff)
fix(server/clients): async initialization
API: newClient no longer take any args API: manual isValid() check is needed to interact with client now
-rw-r--r--include/libsock/server/client.hpp1
-rw-r--r--include/libsock/server/clients.hpp2
-rw-r--r--src/server/client.cpp2
-rw-r--r--src/server/clients.cpp4
4 files changed, 6 insertions, 3 deletions
diff --git a/include/libsock/server/client.hpp b/include/libsock/server/client.hpp
index 591bc2a..1d07837 100644
--- a/include/libsock/server/client.hpp
+++ b/include/libsock/server/client.hpp
@@ -48,6 +48,7 @@ class Client {
bool isValid();
private:
+ void init();
Client(SP<Server> server, SP<Clients> clients, bool track = false, bool oneShot = true);
WP<Client> m_self;
diff --git a/include/libsock/server/clients.hpp b/include/libsock/server/clients.hpp
index b18c043..dac5dd1 100644
--- a/include/libsock/server/clients.hpp
+++ b/include/libsock/server/clients.hpp
@@ -24,7 +24,7 @@ class Clients : public std::enable_shared_from_this<Clients> {
static SP<Clients> create(WP<Server> server);
~Clients();
- SP<Client> newClient(std::function<void(const WP<Client> &)> loopFunc = [](const WP<Client> &) { ; });
+ SP<Client> newClient();
void broadcast(const std::string &msg, std::optional<WP<Client>> self = std::nullopt); // second param only specified when we
// want to exclude the sender
diff --git a/src/server/client.cpp b/src/server/client.cpp
index e84a654..aa2cdd1 100644
--- a/src/server/client.cpp
+++ b/src/server/client.cpp
@@ -23,7 +23,9 @@ Client::Client(SP<Server> server, SP<Clients> clients, bool track, bool oneShot)
throw std::runtime_error("server:client: ClientManager doesn't exist");
if (m_wpServer.expired())
throw std::runtime_error("server:client: Server doesn't exist");
+}
+void Client::init() {
m_sockfd = std::make_shared<LibSock::CFileDescriptor>(accept(m_wpServer.lock()->getSocket()->get(), reinterpret_cast<sockaddr *>(&m_addr), &m_addrLen)); // if this is in the init list, it will run before
// m_addrLen, so it won't work :/
diff --git a/src/server/clients.cpp b/src/server/clients.cpp
index a274224..710f813 100644
--- a/src/server/clients.cpp
+++ b/src/server/clients.cpp
@@ -58,9 +58,9 @@ Clients::~Clients() {
vpClients.erase(std::remove_if(vpClients.begin(), vpClients.end(), [this](const WP<Clients> &wptr) { return !wptr.owner_before(m_self) && !m_self.owner_before(wptr); }), vpClients.end());
}
-SP<Client> Clients::newClient(std::function<void(const WP<Client> &)> loopFunc) {
+SP<Client> Clients::newClient() {
SP client = SP<Client>(new Client(m_wpServer.lock(), shared_from_this()));
- auto &instance = m_vClients.emplace_back(std::jthread([&client, &loopFunc]() { loopFunc(client); }), client);
+ auto &instance = m_vClients.emplace_back(std::jthread([&client]() { client->init(); }), client);
instance.second->m_self = std::weak_ptr<Client>(instance.second);
return client;
}