46 {
47 std::cout << "=== Connection Pool Example ===" << std::endl;
48
49
51 constexpr uint16_t port = 9002;
52
54 .port = port,
55 .server_id = "PoolTestServer",
56 });
57
58 std::mutex sessions_mutex;
59 std::map<std::string, std::shared_ptr<interfaces::i_session>> sessions;
60
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;
65 });
66
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));
71 });
72
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));
80 }
81 });
82
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;
86 return 1;
87 }
88 std::cout << "Echo server started on port " << port << std::endl;
89 std::this_thread::sleep_for(std::chrono::milliseconds(100));
90
91
92 constexpr size_t pool_size = 5;
93
94 auto pool =
tcp.create_connection_pool({
95 .host = "127.0.0.1",
96 .port = port,
97 .pool_size = pool_size,
98 });
99
100 auto init_result = pool->initialize();
101 if (init_result.is_err()) {
102 std::cerr << "Pool init failed: " << init_result.error().message << std::endl;
104 return 1;
105 }
106 std::cout << "Connection pool initialized: " << pool->pool_size() << " connections"
107 << std::endl;
108
109
110 std::cout << "\n--- Single-threaded usage ---" << std::endl;
111 {
112 auto client = pool->acquire();
113 std::cout << "Acquired connection. Active: " << pool->active_count() << "/"
114 << pool->pool_size() << std::endl;
115
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;
120 } else {
121 std::cerr << "Send failed: " << result.error().message << std::endl;
122 }
123
124 pool->release(std::move(client));
125 std::cout << "Released connection. Active: " << pool->active_count() << "/"
126 << pool->pool_size() << std::endl;
127 }
128
129
130 std::cout << "\n--- Multi-threaded usage ---" << std::endl;
131 {
132 constexpr int num_workers = 4;
133 constexpr int requests_per_worker = 10;
134
135 std::atomic<int> success_count{0};
136 std::atomic<int> failure_count{0};
137 std::vector<std::future<void>> futures;
138
139 auto start_time = std::chrono::steady_clock::now();
140
141 for (int w = 0; w < num_workers; ++w) {
142 futures.push_back(
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();
146
147 std::vector<uint8_t>
data = {
148 static_cast<uint8_t>('A' + w),
149 static_cast<uint8_t>('0' + i),
150 };
151
152 auto result =
client->send_packet(std::move(data));
153 if (result.is_ok()) {
154 success_count.fetch_add(1, std::memory_order_relaxed);
155 } else {
156 failure_count.fetch_add(1, std::memory_order_relaxed);
157 }
158
159 pool->release(std::move(client));
160 std::this_thread::sleep_for(std::chrono::milliseconds(5));
161 }
162 }));
163 }
164
165 for (auto& f : futures) {
166 f.wait();
167 }
168
169 auto end_time = std::chrono::steady_clock::now();
170 auto duration_ms =
171 std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time)
172 .count();
173
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"
180 << std::endl;
181 }
182 }
183
184
185 std::cout << "\nStopping server..." << std::endl;
187 std::cout << "=== Connection pool example completed ===" << std::endl;
188
189 return 0;
190}
Simplified facade for creating TCP clients and servers.
@ client
Client-side request.
@ server
Server-side handling of a request.