提交 c4036696 编写于 作者: Y youngwolf 提交者: youngowlf

Add streaming unpacker to receive native data.

上级 9fc6e981
......@@ -5,7 +5,8 @@
#define ST_ASIO_SERVER_PORT 9527
#define ST_ASIO_FORCE_TO_USE_MSG_RECV_BUFFER //force to use the msg recv buffer
#define ST_ASIO_CUSTOM_LOG
#define ST_ASIO_DEFAULT_UNPACKER unbuffered_unpacker
//#define ST_ASIO_DEFAULT_UNPACKER unbuffered_unpacker
#define ST_ASIO_DEFAULT_UNPACKER stream_unpacker
//the following three macros demonstrate how to support huge msg(exceed 65535 - 2).
//huge msg will consume huge memory, for example, if we want to support 1M msg size, because every st_tcp_socket has a
......
......@@ -206,9 +206,10 @@ int main(int argc, const char* argv[])
//if all clients used the same protocol, we can pack msg one time, and send it repeatedly like this:
packer p;
auto msg = p.pack_msg(str.data(), str.size() + 1);
// auto msg = p.pack_msg(str.data(), str.size() + 1);
//send \0 character too, because asio_client used inflexible_buffer as its msg type, it will not append \0 character automatically as std::string does,
//so need \0 character when printing it.
auto msg = p.pack_msg(str, true); //if asio_client is using stream_unpacker
if (!msg.empty())
server_.do_something_to_all([&msg](st_server_base<normal_server_socket>::object_ctype& item) {item->direct_send_msg(msg);});
}
......
......@@ -5,7 +5,8 @@
#define ST_ASIO_SERVER_PORT 9528
#define ST_ASIO_FORCE_TO_USE_MSG_RECV_BUFFER //force to use the msg recv buffer
#define ST_ASIO_CUSTOM_LOG
#define ST_ASIO_DEFAULT_UNPACKER unbuffered_unpacker
//#define ST_ASIO_DEFAULT_UNPACKER unbuffered_unpacker
#define ST_ASIO_DEFAULT_UNPACKER stream_unpacker
//the following three macros demonstrate how to support huge msg(exceed 65535 - 2).
//huge msg will consume huge memory, for example, if we want to support 1M msg size, because every st_tcp_socket has a
......
......@@ -213,7 +213,8 @@ int main(int argc, const char* argv[])
packer::msg_type msg;
//send \0 character too, because asio_client used inflexible_buffer as its msg type, it will not append \0 character automatically as std::string does,
//so need \0 character when printing it.
if (p.pack_msg(msg, str.data(), str.size() + 1))
// if (p.pack_msg(msg, str.data(), str.size() + 1))
if (p.pack_msg(msg, str, true)) //if asio_client is using stream_unpacker
server_.do_something_to_all(boost::bind((bool (normal_server_socket::*)(packer::msg_ctype&, bool)) &normal_server_socket::direct_send_msg, _1, boost::cref(msg), false));
}
}
......
......@@ -479,6 +479,29 @@ private:
size_t remain_len; //half-baked msg
};
class stream_unpacker : public i_unpacker<std::string>
{
public:
virtual void reset_state() {}
virtual bool parse_msg(size_t bytes_transferred, container_type& msg_can)
{
if (0 == bytes_transferred)
return false;
assert(bytes_transferred <= ST_ASIO_MSG_BUFFER_SIZE);
msg_can.resize(msg_can.size() + 1);
msg_can.back().assign(raw_buff.data(), bytes_transferred);
return true;
}
virtual size_t completion_condition(const boost::system::error_code& ec, size_t bytes_transferred) {return ec || bytes_transferred > 0 ? 0 : ST_ASIO_MSG_BUFFER_SIZE;}
virtual boost::asio::mutable_buffers_1 prepare_next_recv() {return boost::asio::buffer(raw_buff);}
protected:
boost::array<char, ST_ASIO_MSG_BUFFER_SIZE> raw_buff;
};
} //namespace
#endif /* ST_ASIO_WRAPPER_UNPACKER_H_ */
......@@ -478,6 +478,29 @@ private:
size_t remain_len; //half-baked msg
};
class stream_unpacker : public i_unpacker<std::string>
{
public:
virtual void reset_state() {}
virtual bool parse_msg(size_t bytes_transferred, container_type& msg_can)
{
if (0 == bytes_transferred)
return false;
assert(bytes_transferred <= ST_ASIO_MSG_BUFFER_SIZE);
msg_can.resize(msg_can.size() + 1);
msg_can.back().assign(raw_buff.data(), bytes_transferred);
return true;
}
virtual size_t completion_condition(const boost::system::error_code& ec, size_t bytes_transferred) {return ec || bytes_transferred > 0 ? 0 : ST_ASIO_MSG_BUFFER_SIZE;}
virtual boost::asio::mutable_buffers_1 prepare_next_recv() {return boost::asio::buffer(raw_buff);}
protected:
boost::array<char, ST_ASIO_MSG_BUFFER_SIZE> raw_buff;
};
} //namespace
#endif /* ST_ASIO_WRAPPER_UNPACKER_H_ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册