Skip to content
This repository has been archived by the owner on Nov 15, 2019. It is now read-only.

Commit

Permalink
remove magic number and string.
Browse files Browse the repository at this point in the history
  • Loading branch information
Gogs committed May 31, 2016
1 parent 5cd9ab5 commit dc33042
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 32 deletions.
19 changes: 10 additions & 9 deletions client_proxy/client_proxy.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <boost/bind.hpp>
#include <boost/smart_ptr.hpp>
#include "../log.hpp"
#include "../consts.h"


using boost::asio::ip::tcp;
Expand All @@ -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)
Expand All @@ -32,7 +33,7 @@ struct call_detail :
yield socket_.async_send(message_, boost::bind(&call_detail<HandlerT>::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<HandlerT>::do_call, this->shared_from_this(), boost::asio::placeholders::error));
yield socket_.async_receive(boost::asio::buffer(&len_, HEAD_LEN), boost::bind(&call_detail<HandlerT>::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<HandlerT>::do_call, this->shared_from_this(), boost::asio::placeholders::error));
Expand Down Expand Up @@ -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));
Expand All @@ -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<typename... Args>
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -309,7 +310,7 @@ class client_proxy : private boost::noncopyable
int len = json_str.length();

std::vector<boost::asio::const_buffer> 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);
Expand All @@ -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];
};

25 changes: 3 additions & 22 deletions client_proxy/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,7 @@
#include <kapok/Kapok.hpp>
#include "client_proxy.hpp"
#include "base64.hpp"


//result要么是基本类型,要么是结构体;当请求成功时,code为0, 如果请求是无返回类型的,则result为空;
//如果是有返回值的,则result为返回值。response_msg会序列化为一个标准的json串,回发给客户端。
//网络消息的格式是length+body,由4个字节的长度信息(用来指示包体的长度)加包体组成。
template<typename T>
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
{
Expand Down Expand Up @@ -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<T> response = {};
dr.Deserialize(response);
Expand All @@ -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;
}
}

Expand Down
1 change: 1 addition & 0 deletions consts.h
Original file line number Diff line number Diff line change
@@ -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;
6 changes: 5 additions & 1 deletion server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::mutex> lock(mtx_);

auto range = conn_map_.equal_range(topic);
if (range.first == range.second)
return;
Expand All @@ -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();
Expand Down Expand Up @@ -151,6 +153,8 @@ class server : private boost::noncopyable
std::shared_ptr<connection> conn_;
std::shared_ptr<std::thread> thd_;
std::size_t timeout_milli_;
#ifdef PUB_SUB
std::mutex mtx_;
#endif
};

0 comments on commit dc33042

Please sign in to comment.