diff --git a/client_proxy/client_proxy.hpp b/client_proxy/client_proxy.hpp index 3354d9d..5eea397 100644 --- a/client_proxy/client_proxy.hpp +++ b/client_proxy/client_proxy.hpp @@ -7,6 +7,7 @@ #include #include #include "../log.hpp" +#include "../consts.h" using boost::asio::ip::tcp; @@ -20,7 +21,7 @@ struct call_detail : call_detail(const std::string& json_str, tcp::socket& socket, HandlerT handler) :json_str_(json_str), len_(json_str.size()), socket_(socket), handler_(handler) { - message_.push_back(boost::asio::buffer(&len_, 4)); + message_.push_back(boost::asio::buffer(&len_, HEAD_LEN)); message_.push_back(boost::asio::buffer(json_str_)); } void do_call(boost::system::error_code const& ec) @@ -32,7 +33,7 @@ struct call_detail : yield socket_.async_send(message_, boost::bind(&call_detail::do_call, this->shared_from_this(), boost::asio::placeholders::error)); __CHECK_RETURN(); message_.clear(); - yield socket_.async_receive(boost::asio::buffer(&len_, 4), boost::bind(&call_detail::do_call, this->shared_from_this(), boost::asio::placeholders::error)); + yield socket_.async_receive(boost::asio::buffer(&len_, HEAD_LEN), boost::bind(&call_detail::do_call, this->shared_from_this(), boost::asio::placeholders::error)); __CHECK_RETURN(); recv_json_.resize(len_); yield socket_.async_receive(boost::asio::buffer(&recv_json_[0], len_), boost::bind(&call_detail::do_call, this->shared_from_this(), boost::asio::placeholders::error)); @@ -76,7 +77,7 @@ class client_proxy : private boost::noncopyable if (!r) throw std::runtime_error("call failed"); - socket_.receive(boost::asio::buffer(&len, 4)); + socket_.receive(boost::asio::buffer(&len, HEAD_LEN)); std::string recv_json; recv_json.resize(len); socket_.receive(boost::asio::buffer(&recv_json[0], len)); @@ -99,7 +100,7 @@ class client_proxy : private boost::noncopyable std::string sub(const std::string& topic) { - return call("sub_timax", topic); + return call(SUB_TOPIC, topic); } template @@ -204,7 +205,7 @@ class client_proxy : private boost::noncopyable } const int body_len = *(int*)head_; - if (body_len <= 0 || body_len>max_length) + if (body_len <= 0 || body_len>MAX_BUF_LEN) return 0; boost::asio::read(socket_, boost::asio::buffer(recv_data_, body_len), ec); @@ -309,7 +310,7 @@ class client_proxy : private boost::noncopyable int len = json_str.length(); std::vector message; - message.push_back(boost::asio::buffer(&len, 4)); + message.push_back(boost::asio::buffer(&len, HEAD_LEN)); message.push_back(boost::asio::buffer(json_str)); boost::system::error_code ec; boost::asio::write(socket_, message, ec); @@ -329,8 +330,8 @@ class client_proxy : private boost::noncopyable boost::asio::io_service& io_service_; tcp::socket socket_; - enum { max_length = 8192 }; - char head_[4]; - char recv_data_[max_length]; + + char head_[HEAD_LEN]; + char recv_data_[MAX_BUF_LEN]; }; diff --git a/client_proxy/main.cpp b/client_proxy/main.cpp index df1e37e..719006b 100644 --- a/client_proxy/main.cpp +++ b/client_proxy/main.cpp @@ -6,26 +6,7 @@ #include #include "client_proxy.hpp" #include "base64.hpp" - - -//result要么是基本类型,要么是结构体;当请求成功时,code为0, 如果请求是无返回类型的,则result为空; -//如果是有返回值的,则result为返回值。response_msg会序列化为一个标准的json串,回发给客户端。 -//网络消息的格式是length+body,由4个字节的长度信息(用来指示包体的长度)加包体组成。 -template -struct response_msg -{ - int code; - T result; //json格式字符串,基本类型或者是结构体. - META(code, result); -}; - -enum result_code -{ - OK = 0, - FAIL = 1, - EXCEPTION = 2, - -}; +#include "../common.h" struct person { @@ -71,7 +52,7 @@ void handle_result(const char* result) dr.Parse(result); Document& doc = dr.GetDocument(); doc.Parse(result); - if (doc["code"].GetInt() == result_code::OK) + if (doc[CODE].GetInt() == result_code::OK) { response_msg response = {}; dr.Deserialize(response); @@ -80,7 +61,7 @@ void handle_result(const char* result) else { //maybe exception, output the exception message. - std::cout << doc["result"].GetString() << std::endl; + std::cout << doc[RESULT].GetString() << std::endl; } } diff --git a/consts.h b/consts.h index a4e389c..2e2ac75 100644 --- a/consts.h +++ b/consts.h @@ -1,6 +1,7 @@ #pragma once const char* SUB_TOPIC = "sub_topic"; const char* RESULT = "result"; +const char* CODE = "code"; const int MAX_BUF_LEN = 8192; const int HEAD_LEN = 4; diff --git a/server.hpp b/server.hpp index 8c76983..4cec819 100644 --- a/server.hpp +++ b/server.hpp @@ -77,8 +77,9 @@ class server : private boost::noncopyable void pub(const std::string& topic, const std::string& result) { decltype(conn_map_.equal_range(topic)) temp; - +#ifdef PUB_SUB std::unique_lock lock(mtx_); + auto range = conn_map_.equal_range(topic); if (range.first == range.second) return; @@ -99,6 +100,7 @@ class server : private boost::noncopyable } lock.lock(); //clear invalid connection +#endif for (auto it = conn_map_.cbegin(); it != conn_map_.end();) { auto ptr = it->second.lock(); @@ -151,6 +153,8 @@ class server : private boost::noncopyable std::shared_ptr conn_; std::shared_ptr thd_; std::size_t timeout_milli_; +#ifdef PUB_SUB std::mutex mtx_; +#endif };