2013-03-21 1 views
1

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에 추가됩니다. 정확히 여기서 무슨 일이 일어나고있는거야? 이 점을 분명히하는 설명이 있으면 감사하겠습니다.

+1

io_service에 추가 된 "작업"은 수락 자입니다. io_service를 생성자에 전달하여 생성합니다. async_accept를 호출하면 작업이 io_service에 게시됩니다. – Loghorn

답변

1

우선, 간단한 서버 코드가 정상적으로 보입니다. io_service은 I/O 작업을 처리합니다. 더 나은 당신은 즉시 반환에서 io_service::run()을 방지하기 위해 io_service::work 객체가 필요없는 비동기 작업

asynchronous connect

에 대한 역할을 이해하기 위해하는 Asio anatomy을 연구하는 것이 유용 할 것이다. 귀하의 경우 io_serviceasync_accept()의 작업을 수행했으며 OnAccept()에는 async_accept()으로 더 많은 작업을 수행 할 것으로 예상됩니다.

이와 유사한 질문에 대해서는 answers과 같이 유용 할 수 있습니다.