TCP/IP 소켓과 관련하여 io_service의 역할을 이해하는 데 어려움이 있습니다. 다음은 io_service에 대한 기본적인 이해입니다. io_service->run()
은 에 대해 또는 dispatch
으로 작업 요청을 차단하고 받아들입니다 (우리는 io_service::work
을 사용합니다). 내가 여기서 맞습니까? 내가 누락 된 것이 있으면 알려주시겠습니까? 이제 다음은 간단한 서버 지금TCP/IP 소켓에서 io_service 역할 - 이해가 필요함
void RunServer()
{
boost::shared_ptr<boost::asio::io_service> io_service(new boost::asio::io_service);
boost::shared_ptr<boost::asio::ip::tcp::acceptor> acceptor(new boost::asio::ip::tcp::acceptor(*io_service));
boost::shared_ptr<boost::asio::ip::tcp::socket> sock(new boost::asio::ip::tcp::socket(*io_service));
try
{
boost::asio::ip::tcp::resolver resolver(*io_service);
boost::asio::ip::tcp::resolver::query query("127.0.0.1", boost::lexical_cast<std::string>(7777));
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
acceptor->open(endpoint.protocol());
acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(false));
acceptor->bind(endpoint);
acceptor->listen(boost::asio::socket_base::max_connections);
acceptor->async_accept(*sock, boost::bind(OnAccept, _1, sock));//Receives only one connection
std::cout << "Waiting for incoming connections \n";
io_service->run(); //Confusion here --- Line A
}
catch(std::exception & ex)
{
std::cout << "[" << boost::this_thread::get_id()<< "] Exception: " << ex.what() << std::endl;
}
}
I가 넣다 어떤 작업 개체가 올바른 io_service->run()
차단하지 않습니다 방법을, io_service에 부착 없다는 것을 알고 내 코드는? 이제 내 질문은 위의 역할은 io_service->run()
입니다. 실험에서 나는 코드를 제거하면 OnAccept
메서드가 호출되지 않는다는 것을 깨달았습니다. 또한 작품은 io_service
에 추가됩니다. 정확히 여기서 무슨 일이 일어나고있는거야? 이 점을 분명히하는 설명이 있으면 감사하겠습니다.
io_service에 추가 된 "작업"은 수락 자입니다. io_service를 생성자에 전달하여 생성합니다. async_accept를 호출하면 작업이 io_service에 게시됩니다. – Loghorn