47 std::cout <<
"=== Connection Pool Example ===" << std::endl;
51 constexpr uint16_t port = 9002;
53 auto server = tcp.create_server({
55 .server_id =
"PoolTestServer",
58 std::mutex sessions_mutex;
59 std::map<std::string, std::shared_ptr<interfaces::i_session>> sessions;
61 server->set_connection_callback(
62 [&sessions, &sessions_mutex](std::shared_ptr<interfaces::i_session> session) {
63 std::lock_guard<std::mutex> lock(sessions_mutex);
64 sessions[std::string(session->id())] = session;
67 server->set_disconnection_callback(
68 [&sessions, &sessions_mutex](std::string_view session_id) {
69 std::lock_guard<std::mutex> lock(sessions_mutex);
70 sessions.erase(std::string(session_id));
73 server->set_receive_callback(
74 [&sessions, &sessions_mutex](std::string_view session_id,
75 const std::vector<uint8_t>& data) {
76 std::lock_guard<std::mutex> lock(sessions_mutex);
77 auto it = sessions.find(std::string(session_id));
78 if (it != sessions.end()) {
79 it->second->send(std::vector<uint8_t>(data));
83 auto server_result = server->start(port);
84 if (server_result.is_err()) {
85 std::cerr <<
"Server start failed: " << server_result.error().message << std::endl;
88 std::cout <<
"Echo server started on port " << port << std::endl;
89 std::this_thread::sleep_for(std::chrono::milliseconds(100));
92 constexpr size_t pool_size = 5;
94 auto pool = tcp.create_connection_pool({
97 .pool_size = pool_size,
100 auto init_result = pool->initialize();
101 if (init_result.is_err()) {
102 std::cerr <<
"Pool init failed: " << init_result.error().message << std::endl;
106 std::cout <<
"Connection pool initialized: " << pool->pool_size() <<
" connections"
110 std::cout <<
"\n--- Single-threaded usage ---" << std::endl;
112 auto client = pool->acquire();
113 std::cout <<
"Acquired connection. Active: " << pool->active_count() <<
"/"
114 << pool->pool_size() << std::endl;
116 std::vector<uint8_t> data = {
'p',
'i',
'n',
'g'};
117 auto result = client->send_packet(std::move(data));
118 if (result.is_ok()) {
119 std::cout <<
"Sent 'ping' successfully" << std::endl;
121 std::cerr <<
"Send failed: " << result.error().message << std::endl;
124 pool->release(std::move(client));
125 std::cout <<
"Released connection. Active: " << pool->active_count() <<
"/"
126 << pool->pool_size() << std::endl;
130 std::cout <<
"\n--- Multi-threaded usage ---" << std::endl;
132 constexpr int num_workers = 4;
133 constexpr int requests_per_worker = 10;
135 std::atomic<int> success_count{0};
136 std::atomic<int> failure_count{0};
137 std::vector<std::future<void>> futures;
139 auto start_time = std::chrono::steady_clock::now();
141 for (
int w = 0; w < num_workers; ++w) {
143 std::async(std::launch::async, [&pool, w, &success_count, &failure_count]() {
144 for (
int i = 0; i < requests_per_worker; ++i) {
145 auto client = pool->acquire();
147 std::vector<uint8_t> data = {
148 static_cast<uint8_t
>(
'A' + w),
149 static_cast<uint8_t
>(
'0' + i),
152 auto result = client->send_packet(std::move(data));
153 if (result.is_ok()) {
154 success_count.fetch_add(1, std::memory_order_relaxed);
156 failure_count.fetch_add(1, std::memory_order_relaxed);
159 pool->release(std::move(client));
160 std::this_thread::sleep_for(std::chrono::milliseconds(5));
165 for (
auto& f : futures) {
169 auto end_time = std::chrono::steady_clock::now();
171 std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time)
174 int total = num_workers * requests_per_worker;
175 std::cout <<
"Completed " << success_count.load() <<
"/" << total
176 <<
" requests in " << duration_ms <<
" ms" << std::endl;
177 std::cout <<
"Failed: " << failure_count.load() << std::endl;
178 if (duration_ms > 0) {
179 std::cout <<
"Throughput: " << (total * 1000 / duration_ms) <<
" req/s"
185 std::cout <<
"\nStopping server..." << std::endl;
187 std::cout <<
"=== Connection pool example completed ===" << std::endl;