asyn_server.cc 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <boost/foreach.hpp>
  2. #include <boost/bind.hpp>
  3. #include "base/base.h"
  4. #include "net/asyn_server.h"
  5. namespace hainan {
  6. asyn_server::asyn_server(const std::string& address, const std::string& port) :
  7. io_service_(), acceptor_(io_service_),
  8. connections_(), new_connection_(new connection(io_service_, connections_))
  9. {
  10. boost::asio::ip::tcp::resolver resolver(io_service_);
  11. boost::asio::ip::tcp::resolver::query query(address, port);
  12. boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
  13. acceptor_.open(endpoint.protocol());
  14. acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
  15. acceptor_.bind(endpoint);
  16. acceptor_.listen();
  17. acceptor_.async_accept(new_connection_->socket(),
  18. boost::bind(&asyn_server::handle_accept, this,
  19. boost::asio::placeholders::error));
  20. }
  21. void asyn_server::handle_accept(const boost::system::error_code& e)
  22. {
  23. if (!e)
  24. {
  25. connections_.insert(new_connection_);
  26. new_connection_.reset(new connection(io_service_, connections_));
  27. acceptor_.async_accept(new_connection_->socket(),
  28. boost::bind(&asyn_server::handle_accept, this,
  29. boost::asio::placeholders::error));
  30. }
  31. }
  32. void asyn_server::handle_stop()
  33. {
  34. acceptor_.close();
  35. foreach(connection_ptr connection, connections_)
  36. {
  37. connection->stop();
  38. }
  39. connections_.clear();
  40. }
  41. void asyn_server::start()
  42. {
  43. io_service_.run();
  44. }
  45. void asyn_server::stop()
  46. {
  47. io_service_.post(boost::bind(&asyn_server::handle_stop, this));
  48. }
  49. } // namespace hainan