RpcServer.cc 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. namespace Hainan {
  7. RpcServer::RpcServer(std::string& host, int port)
  8. {
  9. boost::asio::ip::address address;
  10. address.from_string(host);
  11. boost::asio::ip::tcp::endpoint endpoint(address, port);
  12. acceptor.open(endpoint.protocol());
  13. acceptor.set_option(
  14. boost::asio::ip::tcp::acceptor::reuse_address(true));
  15. acceptor.bind(endpoint);
  16. acceptor.listen();
  17. RpcSessionPtr new_session(new RpcSession(io_service, sessions));
  18. acceptor.async_accept(new_session->socket(),
  19. boost::bind(&RpcServer::HandleAsyncAccept, this,
  20. boost::asio::placeholders::error));
  21. }
  22. void RpcServer::HandleAsyncAccept(
  23. RpcSessionPtr session, const boost::system::error_code& err)
  24. {
  25. if (err)
  26. {
  27. return;
  28. }
  29. session->Start();
  30. sessions.insert(session);
  31. RpcSessionPtr new_session(new RpcSession(io_service, sessions));
  32. acceptor.async_accept(new_session->socket(),
  33. boost::bind(&RpcServer::HandleAsyncAccept, this,
  34. boost::asio::placeholders::error));
  35. }
  36. void RpcServer::Start()
  37. {
  38. io_service.run();
  39. }
  40. void RpcServer::Stop()
  41. {
  42. acceptor.close();
  43. foreach(RpcSessionPtr session, rpc_server->sessions)
  44. {
  45. session->stop();
  46. }
  47. sessions.clear();
  48. }
  49. } // namespace Hainan