HttpServer::AcceptorPtr HttpServer::bind(boost::asio::io_service& service, const std::string& host, const std::string& port) { auto acceptor = AcceptorPtr(new Acceptor(service)); boost::system::error_code error; auto addr = boost::asio::ip::address::from_string(host, error); boost::asio::ip::tcp::endpoint endpoint; if (error) { boost::asio::ip::tcp::resolver resolver(service); boost::asio::ip::tcp::resolver::query query(host, port); boost::asio::ip::tcp::resolver::iterator it = resolver.resolve(query), end; if (it == end) { BOOST_LOG_TRIVIAL(error) << "Error bad address (ip address in dotted format or ipv6 hex format: " << host << ", error msg: " << error.message(); throw UTILS::convert_boost_ec_to_std_ec(error); } else { endpoint = *it; } } else { endpoint = boost::asio::ip::tcp::endpoint(addr, std::stoi(port)); } acceptor->open(endpoint.protocol()); acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true), error); if (error) { BOOST_LOG_TRIVIAL(warning) << "Cannot set REUSEADDR on " << host << " on " << port << ", error msg: " << error.message(); } acceptor->bind(endpoint, error); if (error) { BOOST_LOG_TRIVIAL(error) << "Cannot bind " << host << " on " << port << " error msg: " << error.message(); throw UTILS::convert_boost_ec_to_std_ec(error); } acceptor->listen(boost::asio::socket_base::max_connections, error); if (error) { BOOST_LOG_TRIVIAL(error) << "Cannot listen " << host << " on " << port << ", error msg: " << error.message(); throw UTILS::convert_boost_ec_to_std_ec(error); } return acceptor; }
void my::GateServer::init() { boost::shared_ptr<TcpServer> serverPtr(this); //make sure that shared_from_this() can run perfectly ok! Json::Value gateConf = util::fileSystem::loadJsonFileEval(jsonconf::server_config); if (gateConf == Json::nullValue) { LogW << "Error init GateServer, null gateConf" << LogEnd; return; } //初始化httpSvr { m_HttpServerPtr = HttpServerPtr(new http::HttpServer()); m_HttpServerPtr->init(gateConf); m_HttpServerPtr->run(); } m_GateConf = gateConf; int port = gateConf["gateSvrPort"].asInt(); std::string gameSvrIp = gateConf["gameSvrIp"].asString(); int gameSvrPort = gateConf["gameSvrPort"].asInt(); std::string accountSvrIp = gateConf["accountSvrIp"].asString(); int accountSvrPort = gateConf["accountSvrPort"].asInt(); m_nConnCount = 0; m_nNetIdHolder = 0; m_pEndpoint = EndpointPtr(new boost::asio::ip::tcp::endpoint(ip::tcp::v4(), port)); m_pAcceptor = AcceptorPtr(new boost::asio::ip::tcp::acceptor(core.getService(), *m_pEndpoint)); m_GateHandler = boost::shared_ptr<GateHandler>(new GateHandler()); ConnectionPtr nextConn = boost::shared_ptr<TcpConnection>(new TcpConnection(core.getService(), m_GateHandler, shared_from_this())); m_pAcceptor->async_accept(nextConn->getSocket(), boost::bind(&GateServer::handle_accept, this, nextConn, boost::asio::placeholders::error)); connectToGameSvr(gameSvrIp, gameSvrPort); connectToAccountSvr(accountSvrIp, accountSvrPort); LogD << "Init Gate Server Ok!!!" << LogEnd; update(); }
JME_TcpAcceptor::JME_TcpAcceptor( JMEngine::net::JME_NetHandler::JME_NetHandlerPtr handler, unsigned short port ): _acceptorHandler(handler), _port(port) { _acceptor = AcceptorPtr(new boost::asio::ip::tcp::acceptor(JMECore.getNetIoService(), boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port))); }