Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
QuicClientDemo Class Reference

Simple QUIC client demo. More...

Collaboration diagram for QuicClientDemo:
Collaboration graph

Public Member Functions

 QuicClientDemo (const std::string &server_host, unsigned short server_port)
 
bool run ()
 

Private Member Functions

void setup_callbacks ()
 
void demo_send_default_stream ()
 
void demo_multi_stream ()
 

Private Attributes

std::string server_host_
 
unsigned short server_port_
 
std::shared_ptr< core::messaging_quic_client > client_
 
std::atomic< bool > connected_
 
std::atomic< bool > message_received_
 
std::mutex mutex_
 
std::condition_variable cv_
 

Detailed Description

Simple QUIC client demo.

Definition at line 41 of file quic_client_example.cpp.

Constructor & Destructor Documentation

◆ QuicClientDemo()

QuicClientDemo::QuicClientDemo ( const std::string & server_host,
unsigned short server_port )
inline

Definition at line 44 of file quic_client_example.cpp.

45 : server_host_(server_host)
46 , server_port_(server_port)
47 , connected_(false)
48 , message_received_(false)
49 {
50 }
unsigned short server_port_
std::atomic< bool > message_received_
std::atomic< bool > connected_

Member Function Documentation

◆ demo_multi_stream()

void QuicClientDemo::demo_multi_stream ( )
inlineprivate

Definition at line 184 of file quic_client_example.cpp.

185 {
186 std::cout << "\n=== Multi-Stream Demo ===" << std::endl;
187
188 // Create a new bidirectional stream
189 auto stream_result = client_->create_stream();
190 if (stream_result.is_err())
191 {
192 std::cerr << "Failed to create stream: " << stream_result.error().message << std::endl;
193 return;
194 }
195
196 uint64_t stream_id = stream_result.value();
197 std::cout << "Created bidirectional stream: " << stream_id << std::endl;
198
199 // Send data on the new stream
200 std::string msg = "Hello from stream " + std::to_string(stream_id);
201 std::vector<uint8_t> data(msg.begin(), msg.end());
202
203 auto send_result = client_->send_on_stream(stream_id, std::move(data));
204 if (send_result.is_ok())
205 {
206 std::cout << "Sent message on stream " << stream_id << std::endl;
207 }
208 else
209 {
210 std::cerr << "Failed to send: " << send_result.error().message << std::endl;
211 }
212
213 // Create a unidirectional stream
214 auto uni_stream_result = client_->create_unidirectional_stream();
215 if (uni_stream_result.is_ok())
216 {
217 uint64_t uni_stream_id = uni_stream_result.value();
218 std::cout << "Created unidirectional stream: " << uni_stream_id << std::endl;
219
220 std::string uni_msg = "Unidirectional message";
221 std::vector<uint8_t> uni_data(uni_msg.begin(), uni_msg.end());
222
223 // Send with FIN to close the stream after this message
224 auto uni_send_result = client_->send_on_stream(uni_stream_id,
225 std::move(uni_data),
226 true /* fin */);
227 if (uni_send_result.is_ok())
228 {
229 std::cout << "Sent message on unidirectional stream with FIN" << std::endl;
230 }
231 }
232
233 // Close the bidirectional stream
234 auto close_result = client_->close_stream(stream_id);
235 if (close_result.is_ok())
236 {
237 std::cout << "Closed stream " << stream_id << std::endl;
238 }
239 }
std::shared_ptr< core::messaging_quic_client > client_
auto create_unidirectional_stream() -> Result< uint64_t > override
Creates a new unidirectional stream (interface version).
auto close_stream(uint64_t stream_id) -> VoidResult override
Closes a stream (interface version).
auto send_on_stream(uint64_t stream_id, std::vector< uint8_t > &&data, bool fin=false) -> VoidResult override
Sends data on a specific stream (interface version).
auto create_stream() -> Result< uint64_t > override
Creates a new bidirectional stream (interface version).

References client_, kcenon::network::core::messaging_quic_client::close_stream(), kcenon::network::core::messaging_quic_client::create_stream(), kcenon::network::core::messaging_quic_client::create_unidirectional_stream(), and kcenon::network::core::messaging_quic_client::send_on_stream().

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ demo_send_default_stream()

void QuicClientDemo::demo_send_default_stream ( )
inlineprivate

Definition at line 156 of file quic_client_example.cpp.

157 {
158 std::cout << "\n=== Sending on Default Stream ===" << std::endl;
159
160 // Send string data
161 auto result = client_->send_packet("Hello, QUIC Server!");
162 if (result.is_ok())
163 {
164 std::cout << "Sent string message on default stream" << std::endl;
165 }
166 else
167 {
168 std::cerr << "Failed to send: " << result.error().message << std::endl;
169 }
170
171 // Send binary data
172 std::vector<uint8_t> binary_data = {0x01, 0x02, 0x03, 0x04, 0x05};
173 result = client_->send_packet(std::move(binary_data));
174 if (result.is_ok())
175 {
176 std::cout << "Sent binary data on default stream" << std::endl;
177 }
178 else
179 {
180 std::cerr << "Failed to send: " << result.error().message << std::endl;
181 }
182 }
auto send_packet(std::vector< uint8_t > &&data) -> VoidResult
Send data on the default stream (stream 0).

References client_, and kcenon::network::core::messaging_quic_client::send_packet().

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ run()

bool QuicClientDemo::run ( )
inline

Definition at line 52 of file quic_client_example.cpp.

53 {
54 std::cout << "=== QUIC Client Example ===" << std::endl;
55 std::cout << "Connecting to " << server_host_ << ":" << server_port_ << std::endl;
56
57 // Create QUIC client directly for QUIC-specific features
58 client_ = std::make_shared<core::messaging_quic_client>("quic_demo_client");
59
60 // Set up callbacks
62
63 // Start the client
65 if (result.is_err())
66 {
67 std::cerr << "Failed to start client: " << result.error().message << std::endl;
68 return false;
69 }
70
71 std::cout << "Client started, waiting for connection..." << std::endl;
72
73 // Wait for connection (with timeout)
74 {
75 std::unique_lock<std::mutex> lock(mutex_);
76 bool connected = cv_.wait_for(lock, std::chrono::seconds(10), [this]() {
77 return connected_.load();
78 });
79
80 if (!connected)
81 {
82 std::cerr << "Connection timeout" << std::endl;
83 (void)client_->stop_client();
84 return false;
85 }
86 }
87
88 std::cout << "Connected to server!" << std::endl;
89
90 // Demo: Send data on default stream
92
93 // Demo: Create and use multiple streams
95
96 // Wait a bit for responses
97 std::this_thread::sleep_for(std::chrono::seconds(2));
98
99 // Get statistics
100 auto stats = client_->stats();
101 std::cout << "\n=== Connection Statistics ===" << std::endl;
102 std::cout << "Bytes sent: " << stats.bytes_sent << std::endl;
103 std::cout << "Bytes received: " << stats.bytes_received << std::endl;
104 std::cout << "Packets sent: " << stats.packets_sent << std::endl;
105 std::cout << "Packets received: " << stats.packets_received << std::endl;
106 std::cout << "Packets lost: " << stats.packets_lost << std::endl;
107
108 // Stop the client
109 std::cout << "\nStopping client..." << std::endl;
110 (void)client_->stop_client();
112
113 std::cout << "Client stopped." << std::endl;
114 return true;
115 }
std::condition_variable cv_
auto wait_for_stop() -> void override
Blocks until stop() is called.
auto start_client(std::string_view host, unsigned short port) -> VoidResult
Starts the client with default configuration.
auto stop_client() -> VoidResult
Stops the client and releases all resources.
auto stats() const -> quic_connection_stats
Get connection statistics.

References client_, kcenon::network::connected, connected_, cv_, demo_multi_stream(), demo_send_default_stream(), mutex_, server_host_, server_port_, setup_callbacks(), kcenon::network::core::messaging_quic_client::start_client(), kcenon::network::core::messaging_quic_client::stats(), kcenon::network::core::messaging_quic_client::stop_client(), and kcenon::network::core::messaging_quic_client::wait_for_stop().

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ setup_callbacks()

void QuicClientDemo::setup_callbacks ( )
inlineprivate

Definition at line 118 of file quic_client_example.cpp.

119 {
120 // Connected callback
122 std::cout << "[Callback] Connected to server" << std::endl;
123 connected_.store(true);
124 cv_.notify_all();
125 });
126
127 // Disconnected callback
129 std::cout << "[Callback] Disconnected from server" << std::endl;
130 connected_.store(false);
131 });
132
133 // Error callback
134 client_->set_error_callback([](std::error_code ec) {
135 std::cerr << "[Callback] Error: " << ec.message() << std::endl;
136 });
137
138 // Receive callback for default stream
139 client_->set_receive_callback([this](const std::vector<uint8_t>& data) {
140 std::string msg(data.begin(), data.end());
141 std::cout << "[Callback] Received on default stream: " << msg << std::endl;
142 message_received_.store(true);
143 });
144
145 // Stream receive callback for all streams
147 [](uint64_t stream_id, const std::vector<uint8_t>& data, bool fin) {
148 std::string msg(data.begin(), data.end());
149 std::cout << "[Callback] Stream " << stream_id << ": "
150 << data.size() << " bytes"
151 << (fin ? " (FIN)" : "") << std::endl;
152 std::cout << " Data: " << msg << std::endl;
153 });
154 }
auto set_disconnected_callback(interfaces::i_quic_client::disconnected_callback_t callback) -> void override
Sets the callback for disconnection (interface version).
auto set_receive_callback(interfaces::i_quic_client::receive_callback_t callback) -> void override
Sets the callback for received data on default stream (interface version).
auto set_connected_callback(interfaces::i_quic_client::connected_callback_t callback) -> void override
Sets the callback for connection established (interface version).
auto set_stream_receive_callback(stream_receive_callback_t callback) -> void
Sets the callback for stream data reception (all streams, legacy version).
auto set_error_callback(interfaces::i_quic_client::error_callback_t callback) -> void override
Sets the callback for errors (interface version).
constexpr uint8_t fin
Stream is finished.
Definition frame_types.h:63

References client_, connected_, cv_, message_received_, kcenon::network::core::messaging_quic_client::set_connected_callback(), kcenon::network::core::messaging_quic_client::set_disconnected_callback(), kcenon::network::core::messaging_quic_client::set_error_callback(), kcenon::network::core::messaging_quic_client::set_receive_callback(), and kcenon::network::core::messaging_quic_client::set_stream_receive_callback().

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ client_

std::shared_ptr<core::messaging_quic_client> QuicClientDemo::client_
private

◆ connected_

std::atomic<bool> QuicClientDemo::connected_
private

Definition at line 244 of file quic_client_example.cpp.

Referenced by run(), and setup_callbacks().

◆ cv_

std::condition_variable QuicClientDemo::cv_
private

Definition at line 247 of file quic_client_example.cpp.

Referenced by run(), and setup_callbacks().

◆ message_received_

std::atomic<bool> QuicClientDemo::message_received_
private

Definition at line 245 of file quic_client_example.cpp.

Referenced by setup_callbacks().

◆ mutex_

std::mutex QuicClientDemo::mutex_
private

Definition at line 246 of file quic_client_example.cpp.

Referenced by run().

◆ server_host_

std::string QuicClientDemo::server_host_
private

Definition at line 241 of file quic_client_example.cpp.

Referenced by run().

◆ server_port_

unsigned short QuicClientDemo::server_port_
private

Definition at line 242 of file quic_client_example.cpp.

Referenced by run().


The documentation for this class was generated from the following file: