|
|
@@ -2,7 +2,7 @@
|
|
|
|
|
|
namespace Hainan {
|
|
|
|
|
|
-RpcSession::RpcSession()
|
|
|
+RpcSession::RpcSession(RpcSessionSet& rpc_sessions): sessions(rpc_sessions)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
@@ -11,43 +11,56 @@ boost::asio::ip::tcp::socket& RpcSession::Socket()
|
|
|
return socket;
|
|
|
}
|
|
|
|
|
|
-void RpcSession::HandleAsyncRead(std::size_t bytes_transferred,
|
|
|
- const boost::system::error_code& err)
|
|
|
+void RpcSession::RecvRequestSize()
|
|
|
{
|
|
|
- if (!err)
|
|
|
+ IntPtr size(new int);
|
|
|
+ boost::asio::async_read(socket,
|
|
|
+ boost::asio::buffer(
|
|
|
+ reinterpret_cast<char*>(size.get()), sizeof(int)),
|
|
|
+ boost::bind(&RpcChannel::RecvMessage, this, size,
|
|
|
+ boost::asio::placeholders::error));
|
|
|
+}
|
|
|
+
|
|
|
+void RpcSession::RecvMessage(IntPtr size, const boost::system::error_code& err)
|
|
|
+{
|
|
|
+ if (err)
|
|
|
{
|
|
|
- bool result;
|
|
|
- result = request_parser.parse();
|
|
|
-
|
|
|
- if (result)
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- boost::asio::async_read(boost::asio::buffer(buffer),
|
|
|
- boost::bind(&RpcSession::HandleAsyncRead, shared_from_this(),
|
|
|
- boost::asio::placeholders::bytes_transferred,
|
|
|
- boost::asio::placeholders::error));
|
|
|
- }
|
|
|
+ LOG(ERROR) << "receive request size failed";
|
|
|
+ return;
|
|
|
}
|
|
|
- else if (err != boost::asio::error::operation_aborted)
|
|
|
+ StringPtr ss;
|
|
|
+ boost::asio::async_read(socket,
|
|
|
+ boost::asio::buffer(*ss, *size),
|
|
|
+ boost::bind(&RpcSession::RecvMessageHandler, this, ss,
|
|
|
+ boost::asio::placeholders::error));
|
|
|
+}
|
|
|
+
|
|
|
+void RpcSession::RecvMessageHandler(StringPtr ss,
|
|
|
+ const boost::system::error_code& err)
|
|
|
+{
|
|
|
+ if (err)
|
|
|
{
|
|
|
- sessions.erase(shared_from_this());
|
|
|
+ LOG(ERROR) << "receive request message failed";
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ RpcRequest request;
|
|
|
+ request->ParseFromString(*ss);
|
|
|
+
|
|
|
+
|
|
|
+ // read size
|
|
|
+ RecvRequestSize();
|
|
|
}
|
|
|
|
|
|
void RpcSession::Start()
|
|
|
{
|
|
|
- boost::asio::async_read(boost::asio::buffer(buffer),
|
|
|
- boost::bind(&RpcSession::HandleAsyncRead, shared_from_this(),
|
|
|
- boost::asio::placeholders::bytes_transferred,
|
|
|
- boost::asio::placeholders::error));
|
|
|
+ RecvRequestSize();
|
|
|
}
|
|
|
|
|
|
void RpcSession::Stop()
|
|
|
{
|
|
|
socket.close();
|
|
|
+ sessions.erase(shared_from_this());
|
|
|
}
|
|
|
|
|
|
}
|