2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
31#include <websocketpp/config/asio_no_tls_client.hpp>
32#include <websocketpp/client.hpp>
34#include <websocketpp/common/thread.hpp>
35#include <websocketpp/common/memory.hpp>
52 , m_status(
"Connecting")
60 client::connection_ptr con = c->get_con_from_hdl(hdl);
61 m_server = con->get_response_header(
"Server");
67 client::connection_ptr con = c->get_con_from_hdl(hdl);
68 m_server = con->get_response_header(
"Server");
69 m_error_reason = con->get_ec().message();
74 client::connection_ptr con = c->get_con_from_hdl(hdl);
76 s <<
"close code: " << con->get_remote_close_code() <<
" ("
77 << websocketpp::close::status::get_string(con->get_remote_close_code())
78 <<
"), close reason: " << con->get_remote_close_reason();
79 m_error_reason = s.str();
84 m_messages.push_back(
"<< " + msg->get_payload());
86 m_messages.push_back(
"<< " + websocketpp::utility::to_hex(msg->get_payload()));
98 std::string get_status()
const {
102 void record_sent_message(std::string message) {
103 m_messages.push_back(
">> " + message);
110 std::string m_status;
112 std::string m_server;
113 std::string m_error_reason;
114 std::vector<std::string> m_messages;
118 out <<
"> URI: " << data.m_uri <<
"\n"
119 <<
"> Status: " << data.m_status <<
"\n"
120 <<
"> Remote Server: " << (data.m_server.empty() ?
"None Specified" : data.m_server) <<
"\n"
121 <<
"> Error/close reason: " << (data.m_error_reason.empty() ?
"N/A" : data.m_error_reason) <<
"\n";
122 out <<
"> Messages Processed: (" << data.m_messages.size() <<
") \n";
124 std::vector<std::string>::const_iterator it;
125 for (it = data.m_messages.begin(); it != data.m_messages.end(); ++it) {
134 websocket_endpoint () : m_next_id(0) {
135 m_endpoint.clear_access_channels(websocketpp::log::alevel::all);
136 m_endpoint.clear_error_channels(websocketpp::log::elevel::all);
138 m_endpoint.init_asio();
139 m_endpoint.start_perpetual();
141 m_thread = websocketpp::lib::make_shared<websocketpp::lib::thread>(&client::run, &m_endpoint);
144 ~websocket_endpoint() {
145 m_endpoint.stop_perpetual();
147 for (con_list::const_iterator it = m_connection_list.begin(); it != m_connection_list.end(); ++it) {
148 if (it->second->get_status() !=
"Open") {
153 std::cout <<
"> Closing connection " << it->second->get_id() << std::endl;
156 m_endpoint.close(it->second->get_hdl(), websocketpp::close::status::going_away,
"", ec);
158 std::cout <<
"> Error closing connection " << it->second->get_id() <<
": "
159 << ec.message() << std::endl;
166 int connect(std::string
const & uri) {
169 client::connection_ptr con = m_endpoint.get_connection(uri, ec);
172 std::cout <<
"> Connect initialization error: " << ec.message() << std::endl;
176 int new_id = m_next_id++;
177 connection_metadata::ptr metadata_ptr = websocketpp::lib::make_shared<connection_metadata>(new_id, con->get_handle(), uri);
178 m_connection_list[new_id] = metadata_ptr;
180 con->set_open_handler(websocketpp::lib::bind(
181 &connection_metadata::on_open,
184 websocketpp::lib::placeholders::_1
186 con->set_fail_handler(websocketpp::lib::bind(
187 &connection_metadata::on_fail,
190 websocketpp::lib::placeholders::_1
192 con->set_close_handler(websocketpp::lib::bind(
193 &connection_metadata::on_close,
196 websocketpp::lib::placeholders::_1
199 &connection_metadata::on_message,
201 websocketpp::lib::placeholders::_1,
202 websocketpp::lib::placeholders::_2
205 m_endpoint.connect(con);
213 con_list::iterator metadata_it = m_connection_list.find(id);
214 if (metadata_it == m_connection_list.end()) {
215 std::cout <<
"> No connection found with id " << id << std::endl;
219 m_endpoint.close(metadata_it->second->get_hdl(), code, reason, ec);
221 std::cout <<
"> Error initiating close: " << ec.message() << std::endl;
225 void send(
int id, std::string message) {
228 con_list::iterator metadata_it = m_connection_list.find(id);
229 if (metadata_it == m_connection_list.end()) {
230 std::cout <<
"> No connection found with id " << id << std::endl;
234 m_endpoint.send(metadata_it->second->get_hdl(), message, websocketpp::frame::opcode::text, ec);
236 std::cout <<
"> Error sending message: " << ec.message() << std::endl;
240 metadata_it->second->record_sent_message(message);
244 con_list::const_iterator metadata_it = m_connection_list.find(id);
245 if (metadata_it == m_connection_list.end()) {
246 return connection_metadata::ptr();
248 return metadata_it->second;
252 typedef std::map<
int,connection_metadata::ptr> con_list;
257 con_list m_connection_list;
267 std::cout <<
"Enter Command: ";
268 std::getline(std::cin, input);
270 if (input ==
"quit") {
272 }
else if (input ==
"help") {
274 <<
"\nCommand List:\n"
275 <<
"connect <ws uri>\n"
276 <<
"send <connection id> <message>\n"
277 <<
"close <connection id> [<close code:default=1000>] [<close reason>]\n"
278 <<
"show <connection id>\n"
279 <<
"help: Display this help text\n"
280 <<
"quit: Exit the program\n"
282 }
else if (input.substr(0,7) ==
"connect") {
283 int id = endpoint.connect(input.substr(8));
285 std::cout <<
"> Created connection with id " << id << std::endl;
287 }
else if (input.substr(0,4) ==
"send") {
288 std::stringstream ss(input);
295 std::getline(ss,message);
297 endpoint.send(id, message);
298 }
else if (input.substr(0,5) ==
"close") {
299 std::stringstream ss(input);
306 ss >> cmd >> id >> close_code;
307 std::getline(ss,reason);
309 endpoint.close(id, close_code, reason);
310 }
else if (input.substr(0,4) ==
"show") {
311 int id = atoi(input.substr(5).c_str());
315 std::cout << *metadata << std::endl;
317 std::cout <<
"> Unknown connection id " << id << std::endl;
320 std::cout <<
"> Unrecognized Command" << std::endl;
328
329
330
331
332
333
334
335
Client endpoint role based on the given config.
A package of types and methods for manipulating WebSocket close status'.
static value const normal
uint16_t value
The type of a close code value.
A package of types and methods for manipulating WebSocket close codes.
Constants and utility functions related to WebSocket opcodes.
Data structures and utility functions for manipulating WebSocket frames.
Namespace for the WebSocket++ project.
lib::weak_ptr< void > connection_hdl
A handle to uniquely identify a connection.
Client config with asio transport and TLS disabled.