RpcServer.cc 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <boost/asio.hpp>
  2. #include <boost/foreach.hpp>
  3. #include "Base/Base.h"
  4. #include "Net/RpcServer.h"
  5. #include "Net/RpcSession.h"
  6. #include "Thread/ThreadPool.h"
  7. namespace Hainan {
  8. RpcServer::RpcServer(google::protobuf::Service& pservice, int port):
  9. service(pservice), io_service()
  10. {
  11. boost::asio::ip::address address;
  12. address.from_string("localhost");
  13. boost::asio::ip::tcp::endpoint endpoint(address, port);
  14. acceptor.open(endpoint.protocol());
  15. acceptor.set_option(
  16. boost::asio::ip::tcp::acceptor::reuse_address(true));
  17. acceptor.bind(endpoint);
  18. acceptor.listen();
  19. RpcSessionPtr new_session(new RpcSession(sessions));
  20. acceptor.async_accept(new_session->socket(),
  21. boost::bind(&RpcServer::HandleAsyncAccept, this,
  22. boost::asio::placeholders::error));
  23. }
  24. void RpcServer::HandleAsyncAccept(
  25. RpcSessionPtr session, const boost::system::error_code& err)
  26. {
  27. if (err)
  28. {
  29. return;
  30. }
  31. session->Start();
  32. sessions.insert(session);
  33. RpcSessionPtr new_session(new RpcSession(io_service, sessions));
  34. acceptor.async_accept(new_session->socket(),
  35. boost::bind(&RpcServer::HandleAsyncAccept, this,
  36. boost::asio::placeholders::error));
  37. }
  38. void RpcServer::Start()
  39. {
  40. io_service.run();
  41. }
  42. void RpcServer::Stop()
  43. {
  44. acceptor.close();
  45. foreach(RpcSessionPtr session, rpc_server->sessions)
  46. {
  47. session->stop();
  48. }
  49. sessions.clear();
  50. }
  51. } // namespace Hainan