+Types, start parser
This commit is contained in:
parent
69e082faac
commit
163165c1f9
2
nasfaq/connections/common/common.c
Normal file
2
nasfaq/connections/common/common.c
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#include "common.h"
|
||||||
|
|
27
nasfaq/connections/common/common.h
Normal file
27
nasfaq/connections/common/common.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#ifndef _COMMON_H_
|
||||||
|
#define _COMMON_H_
|
||||||
|
|
||||||
|
enum MSG_TYPE =
|
||||||
|
{ COIN_PRICE_UPDATE
|
||||||
|
, HISTORY_UPDATE
|
||||||
|
, BROKER_FEE_UPDATE
|
||||||
|
, TODAY_PRICES_UPDATE
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct raw_message_t {
|
||||||
|
enum msg_type type;
|
||||||
|
std::string data;
|
||||||
|
} raw_message_t ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
coinPriceUpdate structure
|
||||||
|
*/
|
||||||
|
typedef struct cpu_hld_t {
|
||||||
|
std::string coin;
|
||||||
|
float price;
|
||||||
|
float saleValue;
|
||||||
|
uint inCirculation;
|
||||||
|
} cpu_hld_t
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
43
nasfaq/connections/parser/parser.c
Normal file
43
nasfaq/connections/parser/parser.c
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#include "parser.h"
|
||||||
|
|
||||||
|
enum MSG_TYPE msg_type_detect(std::string op) {
|
||||||
|
MSG_TYPE ret;
|
||||||
|
|
||||||
|
if (op.substr(2, 15) == "coinPriceUpdate") {
|
||||||
|
ret = COIN_PRICE_UPDATE;
|
||||||
|
} else if (op.substr(2, 13) == "historyUpdate") {
|
||||||
|
ret = HISTORY_UPDATE;
|
||||||
|
} else if (op.substr(2, 17) == "todayPricesUpdate") {
|
||||||
|
ret = TODAY_PRICES_UPDATE;
|
||||||
|
}
|
||||||
|
} else if (op.substr(2, 15) == "brokerFeeUpdate") {
|
||||||
|
ret = BROKER_FEE_UPDATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
class parser {
|
||||||
|
public:
|
||||||
|
parser (SafeQueue<raw_msg_t> queue)
|
||||||
|
: m_queue(queue);
|
||||||
|
{}
|
||||||
|
|
||||||
|
void parse() {
|
||||||
|
std::string raw_data;
|
||||||
|
|
||||||
|
msg_type type;
|
||||||
|
std::string data;
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
raw_data = m_queue.dequeue();
|
||||||
|
type = msg_type_detect(raw_data);
|
||||||
|
|
||||||
|
data = m_queue.
|
||||||
|
sleep(0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
SafeQueue<raw_msg_t> m_queue;
|
||||||
|
}
|
||||||
|
|
14
nasfaq/connections/parser/parser.h
Normal file
14
nasfaq/connections/parser/parser.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef _MY_SSL_H_
|
||||||
|
#define _MY_SSL_H_
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
|
#include "../common/common.h"
|
||||||
|
#include "../safe_queue/safe_queue.h"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
2
nasfaq/connections/safe_queue/safe_queue.c
Normal file
2
nasfaq/connections/safe_queue/safe_queue.c
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#include "safe_queue.h"
|
||||||
|
|
51
nasfaq/connections/safe_queue/safe_queue.h
Normal file
51
nasfaq/connections/safe_queue/safe_queue.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#ifndef SAFE_QUEUE
|
||||||
|
#define SAFE_QUEUE
|
||||||
|
|
||||||
|
#include <queue>
|
||||||
|
#include <mutex>
|
||||||
|
#include <condition_variable>
|
||||||
|
|
||||||
|
// A threadsafe-queue.
|
||||||
|
template <class T>
|
||||||
|
class SafeQueue
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SafeQueue(void)
|
||||||
|
: q()
|
||||||
|
, m()
|
||||||
|
, c()
|
||||||
|
{}
|
||||||
|
|
||||||
|
~SafeQueue(void)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// Add an element to the queue.
|
||||||
|
void enqueue(T t)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(m);
|
||||||
|
q.push(t);
|
||||||
|
c.notify_one();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the "front"-element.
|
||||||
|
// If the queue is empty, wait till a element is avaiable.
|
||||||
|
T dequeue(void)
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock(m);
|
||||||
|
while(q.empty())
|
||||||
|
{
|
||||||
|
// release lock as long as the wait and reaquire it afterwards.
|
||||||
|
c.wait(lock);
|
||||||
|
}
|
||||||
|
T val = q.front();
|
||||||
|
q.pop();
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::queue<T> q;
|
||||||
|
mutable std::mutex m;
|
||||||
|
std::condition_variable c;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
Binary file not shown.
@ -1,7 +1,9 @@
|
|||||||
#include "../http/http_connector.h"
|
#include "../http/http_connector.h"
|
||||||
#include "../ws/my_ssl.h"
|
#include "../ws/my_ssl.h"
|
||||||
|
#include "../safe_queue/safe_queue.h"
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
connect_ws(get_sid());
|
std::string sid = sid();
|
||||||
|
connect_ws(sid);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
clang++ ../http/http_connector.cpp \
|
clang++ ../http/http_connector.cpp \
|
||||||
../ws/my_ssl.cpp \
|
../ws/my_ssl.cpp \
|
||||||
|
../safe_queue/safe_queue.cpp \
|
||||||
./main.cpp \
|
./main.cpp \
|
||||||
-o main -lcurl -lcrypto -lssl -lboost_system -lboost_random -lboost_thread -lpthread && ./main
|
-o main -lcurl -lcrypto -lssl -lboost_system -lboost_random -lboost_thread -lpthread && ./main
|
||||||
|
Binary file not shown.
@ -1,335 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2014, Peter Thorson. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the WebSocket++ Project nor the
|
|
||||||
* names of its contributors may be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// **NOTE:** This file is a snapshot of the WebSocket++ utility client tutorial.
|
|
||||||
// Additional related material can be found in the tutorials/utility_client
|
|
||||||
// directory of the WebSocket++ repository.
|
|
||||||
|
|
||||||
#include <websocketpp/config/asio_no_tls_client.hpp>
|
|
||||||
#include <websocketpp/client.hpp>
|
|
||||||
|
|
||||||
#include <websocketpp/common/thread.hpp>
|
|
||||||
#include <websocketpp/common/memory.hpp>
|
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <iostream>
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
typedef websocketpp::client<websocketpp::config::asio_client> client;
|
|
||||||
|
|
||||||
class connection_metadata {
|
|
||||||
public:
|
|
||||||
typedef websocketpp::lib::shared_ptr<connection_metadata> ptr;
|
|
||||||
|
|
||||||
connection_metadata(int id, websocketpp::connection_hdl hdl, std::string uri)
|
|
||||||
: m_id(id)
|
|
||||||
, m_hdl(hdl)
|
|
||||||
, m_status("Connecting")
|
|
||||||
, m_uri(uri)
|
|
||||||
, m_server("N/A")
|
|
||||||
{}
|
|
||||||
|
|
||||||
void on_open(client * c, websocketpp::connection_hdl hdl) {
|
|
||||||
m_status = "Open";
|
|
||||||
|
|
||||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
|
||||||
m_server = con->get_response_header("Server");
|
|
||||||
}
|
|
||||||
|
|
||||||
void on_fail(client * c, websocketpp::connection_hdl hdl) {
|
|
||||||
m_status = "Failed";
|
|
||||||
|
|
||||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
|
||||||
m_server = con->get_response_header("Server");
|
|
||||||
m_error_reason = con->get_ec().message();
|
|
||||||
}
|
|
||||||
|
|
||||||
void on_close(client * c, websocketpp::connection_hdl hdl) {
|
|
||||||
m_status = "Closed";
|
|
||||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
|
||||||
std::stringstream s;
|
|
||||||
s << "close code: " << con->get_remote_close_code() << " ("
|
|
||||||
<< websocketpp::close::status::get_string(con->get_remote_close_code())
|
|
||||||
<< "), close reason: " << con->get_remote_close_reason();
|
|
||||||
m_error_reason = s.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
void on_message(websocketpp::connection_hdl, client::message_ptr msg) {
|
|
||||||
if (msg->get_opcode() == websocketpp::frame::opcode::text) {
|
|
||||||
m_messages.push_back("<< " + msg->get_payload());
|
|
||||||
} else {
|
|
||||||
m_messages.push_back("<< " + websocketpp::utility::to_hex(msg->get_payload()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
websocketpp::connection_hdl get_hdl() const {
|
|
||||||
return m_hdl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_id() const {
|
|
||||||
return m_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string get_status() const {
|
|
||||||
return m_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
void record_sent_message(std::string message) {
|
|
||||||
m_messages.push_back(">> " + message);
|
|
||||||
}
|
|
||||||
|
|
||||||
friend std::ostream & operator<< (std::ostream & out, connection_metadata const & data);
|
|
||||||
private:
|
|
||||||
int m_id;
|
|
||||||
websocketpp::connection_hdl m_hdl;
|
|
||||||
std::string m_status;
|
|
||||||
std::string m_uri;
|
|
||||||
std::string m_server;
|
|
||||||
std::string m_error_reason;
|
|
||||||
std::vector<std::string> m_messages;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::ostream & operator<< (std::ostream & out, connection_metadata const & data) {
|
|
||||||
out << "> URI: " << data.m_uri << "\n"
|
|
||||||
<< "> Status: " << data.m_status << "\n"
|
|
||||||
<< "> Remote Server: " << (data.m_server.empty() ? "None Specified" : data.m_server) << "\n"
|
|
||||||
<< "> Error/close reason: " << (data.m_error_reason.empty() ? "N/A" : data.m_error_reason) << "\n";
|
|
||||||
out << "> Messages Processed: (" << data.m_messages.size() << ") \n";
|
|
||||||
|
|
||||||
std::vector<std::string>::const_iterator it;
|
|
||||||
for (it = data.m_messages.begin(); it != data.m_messages.end(); ++it) {
|
|
||||||
out << *it << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
class websocket_endpoint {
|
|
||||||
public:
|
|
||||||
websocket_endpoint () : m_next_id(0) {
|
|
||||||
m_endpoint.clear_access_channels(websocketpp::log::alevel::all);
|
|
||||||
m_endpoint.clear_error_channels(websocketpp::log::elevel::all);
|
|
||||||
|
|
||||||
m_endpoint.init_asio();
|
|
||||||
m_endpoint.start_perpetual();
|
|
||||||
|
|
||||||
m_thread = websocketpp::lib::make_shared<websocketpp::lib::thread>(&client::run, &m_endpoint);
|
|
||||||
}
|
|
||||||
|
|
||||||
~websocket_endpoint() {
|
|
||||||
m_endpoint.stop_perpetual();
|
|
||||||
|
|
||||||
for (con_list::const_iterator it = m_connection_list.begin(); it != m_connection_list.end(); ++it) {
|
|
||||||
if (it->second->get_status() != "Open") {
|
|
||||||
// Only close open connections
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "> Closing connection " << it->second->get_id() << std::endl;
|
|
||||||
|
|
||||||
websocketpp::lib::error_code ec;
|
|
||||||
m_endpoint.close(it->second->get_hdl(), websocketpp::close::status::going_away, "", ec);
|
|
||||||
if (ec) {
|
|
||||||
std::cout << "> Error closing connection " << it->second->get_id() << ": "
|
|
||||||
<< ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_thread->join();
|
|
||||||
}
|
|
||||||
|
|
||||||
int connect(std::string const & uri) {
|
|
||||||
websocketpp::lib::error_code ec;
|
|
||||||
|
|
||||||
client::connection_ptr con = m_endpoint.get_connection(uri, ec);
|
|
||||||
|
|
||||||
if (ec) {
|
|
||||||
std::cout << "> Connect initialization error: " << ec.message() << std::endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int new_id = m_next_id++;
|
|
||||||
connection_metadata::ptr metadata_ptr = websocketpp::lib::make_shared<connection_metadata>(new_id, con->get_handle(), uri);
|
|
||||||
m_connection_list[new_id] = metadata_ptr;
|
|
||||||
|
|
||||||
con->set_open_handler(websocketpp::lib::bind(
|
|
||||||
&connection_metadata::on_open,
|
|
||||||
metadata_ptr,
|
|
||||||
&m_endpoint,
|
|
||||||
websocketpp::lib::placeholders::_1
|
|
||||||
));
|
|
||||||
con->set_fail_handler(websocketpp::lib::bind(
|
|
||||||
&connection_metadata::on_fail,
|
|
||||||
metadata_ptr,
|
|
||||||
&m_endpoint,
|
|
||||||
websocketpp::lib::placeholders::_1
|
|
||||||
));
|
|
||||||
con->set_close_handler(websocketpp::lib::bind(
|
|
||||||
&connection_metadata::on_close,
|
|
||||||
metadata_ptr,
|
|
||||||
&m_endpoint,
|
|
||||||
websocketpp::lib::placeholders::_1
|
|
||||||
));
|
|
||||||
con->set_message_handler(websocketpp::lib::bind(
|
|
||||||
&connection_metadata::on_message,
|
|
||||||
metadata_ptr,
|
|
||||||
websocketpp::lib::placeholders::_1,
|
|
||||||
websocketpp::lib::placeholders::_2
|
|
||||||
));
|
|
||||||
|
|
||||||
m_endpoint.connect(con);
|
|
||||||
|
|
||||||
return new_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
void close(int id, websocketpp::close::status::value code, std::string reason) {
|
|
||||||
websocketpp::lib::error_code ec;
|
|
||||||
|
|
||||||
con_list::iterator metadata_it = m_connection_list.find(id);
|
|
||||||
if (metadata_it == m_connection_list.end()) {
|
|
||||||
std::cout << "> No connection found with id " << id << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_endpoint.close(metadata_it->second->get_hdl(), code, reason, ec);
|
|
||||||
if (ec) {
|
|
||||||
std::cout << "> Error initiating close: " << ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void send(int id, std::string message) {
|
|
||||||
websocketpp::lib::error_code ec;
|
|
||||||
|
|
||||||
con_list::iterator metadata_it = m_connection_list.find(id);
|
|
||||||
if (metadata_it == m_connection_list.end()) {
|
|
||||||
std::cout << "> No connection found with id " << id << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_endpoint.send(metadata_it->second->get_hdl(), message, websocketpp::frame::opcode::text, ec);
|
|
||||||
if (ec) {
|
|
||||||
std::cout << "> Error sending message: " << ec.message() << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
metadata_it->second->record_sent_message(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
connection_metadata::ptr get_metadata(int id) const {
|
|
||||||
con_list::const_iterator metadata_it = m_connection_list.find(id);
|
|
||||||
if (metadata_it == m_connection_list.end()) {
|
|
||||||
return connection_metadata::ptr();
|
|
||||||
} else {
|
|
||||||
return metadata_it->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
typedef std::map<int,connection_metadata::ptr> con_list;
|
|
||||||
|
|
||||||
client m_endpoint;
|
|
||||||
websocketpp::lib::shared_ptr<websocketpp::lib::thread> m_thread;
|
|
||||||
|
|
||||||
con_list m_connection_list;
|
|
||||||
int m_next_id;
|
|
||||||
};
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
bool done = false;
|
|
||||||
std::string input;
|
|
||||||
websocket_endpoint endpoint;
|
|
||||||
|
|
||||||
while (!done) {
|
|
||||||
std::cout << "Enter Command: ";
|
|
||||||
std::getline(std::cin, input);
|
|
||||||
|
|
||||||
if (input == "quit") {
|
|
||||||
done = true;
|
|
||||||
} else if (input == "help") {
|
|
||||||
std::cout
|
|
||||||
<< "\nCommand List:\n"
|
|
||||||
<< "connect <ws uri>\n"
|
|
||||||
<< "send <connection id> <message>\n"
|
|
||||||
<< "close <connection id> [<close code:default=1000>] [<close reason>]\n"
|
|
||||||
<< "show <connection id>\n"
|
|
||||||
<< "help: Display this help text\n"
|
|
||||||
<< "quit: Exit the program\n"
|
|
||||||
<< std::endl;
|
|
||||||
} else if (input.substr(0,7) == "connect") {
|
|
||||||
int id = endpoint.connect(input.substr(8));
|
|
||||||
if (id != -1) {
|
|
||||||
std::cout << "> Created connection with id " << id << std::endl;
|
|
||||||
}
|
|
||||||
} else if (input.substr(0,4) == "send") {
|
|
||||||
std::stringstream ss(input);
|
|
||||||
|
|
||||||
std::string cmd;
|
|
||||||
int id;
|
|
||||||
std::string message;
|
|
||||||
|
|
||||||
ss >> cmd >> id;
|
|
||||||
std::getline(ss,message);
|
|
||||||
|
|
||||||
endpoint.send(id, message);
|
|
||||||
} else if (input.substr(0,5) == "close") {
|
|
||||||
std::stringstream ss(input);
|
|
||||||
|
|
||||||
std::string cmd;
|
|
||||||
int id;
|
|
||||||
int close_code = websocketpp::close::status::normal;
|
|
||||||
std::string reason;
|
|
||||||
|
|
||||||
ss >> cmd >> id >> close_code;
|
|
||||||
std::getline(ss,reason);
|
|
||||||
|
|
||||||
endpoint.close(id, close_code, reason);
|
|
||||||
} else if (input.substr(0,4) == "show") {
|
|
||||||
int id = atoi(input.substr(5).c_str());
|
|
||||||
|
|
||||||
connection_metadata::ptr metadata = endpoint.get_metadata(id);
|
|
||||||
if (metadata) {
|
|
||||||
std::cout << *metadata << std::endl;
|
|
||||||
} else {
|
|
||||||
std::cout << "> Unknown connection id " << id << std::endl;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
std::cout << "> Unrecognized Command" << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
clang++ -std=c++11 -stdlib=libc++ -I/Users/zaphoyd/software/websocketpp/ -I/Users/zaphoyd/software/boost_1_55_0/ -D_WEBSOCKETPP_CPP11_STL_ step4.cpp /Users/zaphoyd/software/boost_1_55_0/stage/lib/libboost_system.a
|
|
||||||
|
|
||||||
clang++ -I/Users/zaphoyd/software/websocketpp/ -I/Users/zaphoyd/software/boost_1_55_0/ step4.cpp /Users/zaphoyd/software/boost_1_55_0/stage/lib/libboost_system.a /Users/zaphoyd/software/boost_1_55_0/stage/lib/libboost_thread.a /Users/zaphoyd/software/boost_1_55_0/stage/lib/libboost_random.a
|
|
||||||
|
|
||||||
clang++ -std=c++11 -stdlib=libc++ -I/Users/zaphoyd/Documents/websocketpp/ -I/Users/zaphoyd/Documents/boost_1_53_0_libcpp/ -D_WEBSOCKETPP_CPP11_STL_ step4.cpp /Users/zaphoyd/Documents/boost_1_53_0_libcpp/stage/lib/libboost_system.a
|
|
||||||
|
|
||||||
*/
|
|
@ -1 +0,0 @@
|
|||||||
Subproject commit 2c9c5b46bc1f5d3b0ae7623bd66eea4d9426a6c5
|
|
@ -1,12 +1,4 @@
|
|||||||
#include <iostream>
|
#include "my_ssl.h"
|
||||||
#include <string>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <websocketpp/config/asio_client.hpp>
|
|
||||||
#include <websocketpp/client.hpp>
|
|
||||||
|
|
||||||
#include <websocketpp/common/thread.hpp>
|
|
||||||
#include <websocketpp/common/memory.hpp>
|
|
||||||
|
|
||||||
typedef websocketpp::client<websocketpp::config::asio_tls_client> client;
|
typedef websocketpp::client<websocketpp::config::asio_tls_client> client;
|
||||||
typedef std::shared_ptr<boost::asio::ssl::context> context_ptr;
|
typedef std::shared_ptr<boost::asio::ssl::context> context_ptr;
|
||||||
@ -21,7 +13,7 @@ public:
|
|||||||
, m_status("Connecting")
|
, m_status("Connecting")
|
||||||
, m_uri(uri)
|
, m_uri(uri)
|
||||||
, m_server("N/A")
|
, m_server("N/A")
|
||||||
, m_endpoint(endpoint)
|
, m_endpoint(endpoint) // I really hate this, maybe the whole send function altogether should be in this class?
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void on_open(client *c, websocketpp::connection_hdl hdl) {
|
void on_open(client *c, websocketpp::connection_hdl hdl) {
|
||||||
@ -76,11 +68,11 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else if (payload.substr(4, 15) == "coinPriceUpdate") {
|
||||||
|
std::cout << " > payload: " << payload.substr(21, payload.length()-2) << std::endl;
|
||||||
|
nlohmann::json jres = nlohmann::json::parse(payload.substr(21, payload.length()-21-1));
|
||||||
m_messages.push_back(payload);
|
m_messages.push_back(payload);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
m_messages.push_back(websocketpp::utility::to_hex(msg->get_payload()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,18 @@
|
|||||||
#ifndef _MY_SSL_H_
|
#ifndef _MY_SSL_H_
|
||||||
#define _MY_SSL_H_
|
#define _MY_SSL_H_
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <websocketpp/config/asio_client.hpp>
|
||||||
|
#include <websocketpp/client.hpp>
|
||||||
|
|
||||||
|
#include <websocketpp/common/thread.hpp>
|
||||||
|
#include <websocketpp/common/memory.hpp>
|
||||||
|
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
int connect_ws(std::string);
|
int connect_ws(std::string);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1 +0,0 @@
|
|||||||
Subproject commit 1b11fd301531e6df35a6107c1e8665b1e77a2d8e
|
|
@ -1 +0,0 @@
|
|||||||
clang++ my_ssl.cpp -lcrypto -lssl -lboost_system -lboost_random -lboost_thread -lpthread && ./a.out
|
|
@ -1,227 +0,0 @@
|
|||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include <websocketpp/config/asio_no_tls_client.hpp>
|
|
||||||
#include <websocketpp/client.hpp>
|
|
||||||
|
|
||||||
#include <websocketpp/common/thread.hpp>
|
|
||||||
#include <websocketpp/common/memory.hpp>
|
|
||||||
|
|
||||||
typedef websocketpp::client<websocketpp::config::asio_client> client;
|
|
||||||
|
|
||||||
class connection_metadata {
|
|
||||||
public:
|
|
||||||
typedef websocketpp::lib::shared_ptr<connection_metadata> ptr;
|
|
||||||
|
|
||||||
connection_metadata(int id, websocketpp::connection_hdl hdl, std::string uri)
|
|
||||||
: m_id(id)
|
|
||||||
, m_hdl(hdl)
|
|
||||||
, m_status("Connecting")
|
|
||||||
, m_uri(uri)
|
|
||||||
, m_server("N/A")
|
|
||||||
{}
|
|
||||||
|
|
||||||
void on_open(client *c, websocketpp::connection_hdl hdl) {
|
|
||||||
m_status = "Open";
|
|
||||||
|
|
||||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
|
||||||
m_server = con->get_response_header("Server");
|
|
||||||
}
|
|
||||||
|
|
||||||
void on_fail(client *c, websocketpp::connection_hdl hdl) {
|
|
||||||
m_status = "Failed";
|
|
||||||
|
|
||||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
|
||||||
m_server = con->get_response_header("Server");
|
|
||||||
m_error_reason = con->get_ec().message();
|
|
||||||
}
|
|
||||||
|
|
||||||
void on_close(client *c, websocketpp::connection_hdl hdl) {
|
|
||||||
m_status = "Closed";
|
|
||||||
|
|
||||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
|
||||||
std::stringstream s;
|
|
||||||
s << "close code: " << con->get_remote_close_code() << " ("
|
|
||||||
<< websocketpp::close::status::get_string(con->get_remote_close_code())
|
|
||||||
<< "), close reason: " << con->get_remote_close_reason();
|
|
||||||
m_error_reason = s.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
websocketpp::connection_hdl get_hdl() const {
|
|
||||||
return m_hdl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_id() const {
|
|
||||||
return m_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string get_status() const {
|
|
||||||
return m_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
friend std::ostream & operator<< (std::ostream & out, connection_metadata const & data);
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_id;
|
|
||||||
websocketpp::connection_hdl m_hdl;
|
|
||||||
std::string m_status;
|
|
||||||
std::string m_uri;
|
|
||||||
std::string m_server;
|
|
||||||
std::string m_error_reason;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::ostream & operator<< (std::ostream & out, connection_metadata const & data) {
|
|
||||||
out << "> URI: " << data.m_uri << "\n"
|
|
||||||
<< "> Status: " << data.m_status << "\n"
|
|
||||||
<< "> Remote Server: " << (data.m_server.empty() ? "None Specified" : data.m_server) << "\n"
|
|
||||||
<< "> Error/close reason: " << (data.m_error_reason.empty() ? "N/A" : data.m_error_reason);
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
class websocket_endpoint {
|
|
||||||
public:
|
|
||||||
websocket_endpoint() {
|
|
||||||
m_endpoint.clear_access_channels(websocketpp::log::alevel::all);
|
|
||||||
m_endpoint.clear_error_channels(websocketpp::log::elevel::all);
|
|
||||||
|
|
||||||
m_endpoint.init_asio();
|
|
||||||
m_endpoint.start_perpetual();
|
|
||||||
m_thread.reset(new websocketpp::lib::thread(&client::run, &m_endpoint));
|
|
||||||
}
|
|
||||||
|
|
||||||
~websocket_endpoint() {
|
|
||||||
m_endpoint.stop_perpetual();
|
|
||||||
|
|
||||||
for (con_list::const_iterator it = m_connection_list.begin(); it != m_connection_list.end(); ++it) {
|
|
||||||
if (it->second->get_status() != "Open") {
|
|
||||||
// Close only open connections
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "> Closing connection " << it->second->get_id() << std::endl;
|
|
||||||
|
|
||||||
websocketpp::lib::error_code ec;
|
|
||||||
m_endpoint.close(it->second->get_hdl(), websocketpp::close::status::going_away, "", ec);
|
|
||||||
if (ec) {
|
|
||||||
std::cout << "> Error closing connection " << it->second->get_id() << ": "
|
|
||||||
<< ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int connect(std::string const &uri) {
|
|
||||||
websocketpp::lib::error_code ec;
|
|
||||||
|
|
||||||
client::connection_ptr con = m_endpoint.get_connection(uri, ec);
|
|
||||||
|
|
||||||
if(ec) {
|
|
||||||
std::cout << ">Connect initialization error: " << ec.message() << std::endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int new_id = m_next_id++;
|
|
||||||
connection_metadata::ptr metadata_ptr(new connection_metadata(new_id, con->get_handle(), uri));
|
|
||||||
m_connection_list[new_id] = metadata_ptr;
|
|
||||||
|
|
||||||
con->set_open_handler(websocketpp::lib::bind(
|
|
||||||
&connection_metadata::on_open,
|
|
||||||
metadata_ptr,
|
|
||||||
&m_endpoint,
|
|
||||||
websocketpp::lib::placeholders::_1
|
|
||||||
));
|
|
||||||
con->set_fail_handler(websocketpp::lib::bind(
|
|
||||||
&connection_metadata::on_fail,
|
|
||||||
metadata_ptr,
|
|
||||||
&m_endpoint,
|
|
||||||
websocketpp::lib::placeholders::_1
|
|
||||||
));
|
|
||||||
|
|
||||||
m_endpoint.connect(con);
|
|
||||||
|
|
||||||
return new_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
void close(int id, websocketpp::close::status::value code, std::string reason) {
|
|
||||||
websocketpp::lib::error_code ec;
|
|
||||||
|
|
||||||
con_list::iterator metadata_it = m_connection_list.find(id);
|
|
||||||
if (metadata_it == m_connection_list.end()) {
|
|
||||||
std::cout << "> No connection found with id " << id << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_endpoint.close(metadata_it->second->get_hdl(), code, "", ec);
|
|
||||||
if (ec) {
|
|
||||||
std::cout << "> Error initiating close: " << ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
connection_metadata::ptr get_metadata(int id) const {
|
|
||||||
con_list::const_iterator metadata_it = m_connection_list.find(id);
|
|
||||||
if(metadata_it == m_connection_list.end()) {
|
|
||||||
return connection_metadata::ptr();
|
|
||||||
} else {
|
|
||||||
return metadata_it->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
typedef std::map<int, connection_metadata::ptr> con_list;
|
|
||||||
|
|
||||||
client m_endpoint;
|
|
||||||
websocketpp::lib::shared_ptr<websocketpp::lib::thread> m_thread;
|
|
||||||
|
|
||||||
con_list m_connection_list;
|
|
||||||
int m_next_id;
|
|
||||||
};
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
|
|
||||||
bool done = false;
|
|
||||||
std::string input;
|
|
||||||
websocket_endpoint endpoint;
|
|
||||||
|
|
||||||
while(!done) {
|
|
||||||
|
|
||||||
std::cout << "Enter command: ";
|
|
||||||
std::getline(std::cin, input);
|
|
||||||
|
|
||||||
if(input == "quit" || input == "q" ) done = true;
|
|
||||||
else if(input == "help") {
|
|
||||||
std::cout
|
|
||||||
<< "\nCommand List:\n"
|
|
||||||
<< "help: Display this help text\n"
|
|
||||||
<< "quit: Exit the program\n"
|
|
||||||
<< std::endl;
|
|
||||||
} else if (input.substr(0, 7) == "connect") {
|
|
||||||
int id = endpoint.connect(input.substr(8));
|
|
||||||
if(id != -1) {
|
|
||||||
std::cout << ">Created connection with id " << id << std::endl;
|
|
||||||
}
|
|
||||||
} else if (input.substr(0,4) == "show") {
|
|
||||||
int id = atoi(input.substr(5).c_str());
|
|
||||||
|
|
||||||
connection_metadata::ptr metadata = endpoint.get_metadata(id);
|
|
||||||
if (metadata) {
|
|
||||||
std::cout << *metadata << std::endl;
|
|
||||||
} else {
|
|
||||||
std::cout << ">Unknown connection id " << id << std::endl;
|
|
||||||
}
|
|
||||||
} else if (input.substr(0, 5) == "close") {
|
|
||||||
std::stringstream ss(input);
|
|
||||||
|
|
||||||
std::string cmd;
|
|
||||||
int id;
|
|
||||||
int close_code = websocketpp::close::status::normal;
|
|
||||||
std::string reason;
|
|
||||||
|
|
||||||
ss >> cmd >> id >> close_code;
|
|
||||||
std::getline(ss, reason);
|
|
||||||
|
|
||||||
endpoint.close(id, close_code, reason);
|
|
||||||
} else {
|
|
||||||
std::cout << "Unrecognized command" << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
clang++ test_ssl.cpp -lssl -lcrypto -lboost_system -lboost_random -lboost_thread -lpthread && ./a.out
|
|
@ -1,86 +0,0 @@
|
|||||||
#include <websocketpp/config/asio_client.hpp>
|
|
||||||
#include <websocketpp/client.hpp>
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
typedef websocketpp::client<websocketpp::config::asio_tls_client> client;
|
|
||||||
typedef std::shared_ptr<boost::asio::ssl::context> context_ptr;
|
|
||||||
using websocketpp::lib::placeholders::_1;
|
|
||||||
using websocketpp::lib::placeholders::_2;
|
|
||||||
using websocketpp::lib::bind;
|
|
||||||
|
|
||||||
// pull out the type of messages sent by our config
|
|
||||||
typedef websocketpp::config::asio_client::message_type::ptr message_ptr;
|
|
||||||
|
|
||||||
// This message handler will be invoked once for each incoming message. It
|
|
||||||
// prints the message and then sends a copy of the message back to the server.
|
|
||||||
void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg) {
|
|
||||||
std::cout << "on_message called with hdl: " << hdl.lock().get()
|
|
||||||
<< " and message: " << msg->get_payload()
|
|
||||||
<< std::endl;
|
|
||||||
|
|
||||||
|
|
||||||
websocketpp::lib::error_code ec;
|
|
||||||
|
|
||||||
c->send(hdl, msg->get_payload(), msg->get_opcode(), ec);
|
|
||||||
if (ec) {
|
|
||||||
std::cout << "Echo failed because: " << ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static context_ptr on_tls_init() {
|
|
||||||
// establishes a SSL connection
|
|
||||||
context_ptr ctx = std::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::sslv23);
|
|
||||||
|
|
||||||
try {
|
|
||||||
ctx->set_options(boost::asio::ssl::context::default_workarounds |
|
|
||||||
boost::asio::ssl::context::no_sslv2 |
|
|
||||||
boost::asio::ssl::context::no_sslv3 |
|
|
||||||
boost::asio::ssl::context::single_dh_use);
|
|
||||||
} catch (std::exception &e) {
|
|
||||||
std::cout << "Error in context pointer: " << e.what() << std::endl;
|
|
||||||
}
|
|
||||||
return ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
|
||||||
// Create a client endpoint
|
|
||||||
client c;
|
|
||||||
|
|
||||||
std::string uri = "wss://nasfaq.biz/socket/?user=314d0bda-d7f0-4636-aed7-5ea02743604b&EIO=4&transport=websocket";
|
|
||||||
|
|
||||||
if (argc == 2) {
|
|
||||||
uri = argv[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Set logging to be pretty verbose (everything except message payloads)
|
|
||||||
c.set_access_channels(websocketpp::log::alevel::all);
|
|
||||||
c.clear_access_channels(websocketpp::log::alevel::frame_payload);
|
|
||||||
|
|
||||||
// Initialize ASIO
|
|
||||||
c.init_asio();
|
|
||||||
c.set_tls_init_handler(bind(&on_tls_init));
|
|
||||||
|
|
||||||
// Register our message handler
|
|
||||||
c.set_message_handler(bind(&on_message,&c,::_1,::_2));
|
|
||||||
|
|
||||||
websocketpp::lib::error_code ec;
|
|
||||||
client::connection_ptr con = c.get_connection(uri, ec);
|
|
||||||
if (ec) {
|
|
||||||
std::cout << "could not create connection because: " << ec.message() << std::endl;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note that connect here only requests a connection. No network messages are
|
|
||||||
// exchanged until the event loop starts running in the next line.
|
|
||||||
c.connect(con);
|
|
||||||
|
|
||||||
// Start the ASIO io_service run loop
|
|
||||||
// this will cause a single connection to be made to the server. c.run()
|
|
||||||
// will exit when this connection is closed.
|
|
||||||
c.run();
|
|
||||||
} catch (websocketpp::exception const & e) {
|
|
||||||
std::cout << e.what() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user