2013-08-28 2 views
0

다음 코드에서 개인 함수 handle_read_contenthandle_read_content에 따라 asio::async_read을 사용합니다. 이것은 재귀 적 행동을 유발하거나 경쟁 조건을 만들 수 있습니까?클래스 내의 재귀 함수 또는 경쟁 조건은 무엇입니까?

class client 
{ 
public: 
    //constrcutor, io_service, server name? path? 

    client(asio::io_service& io_service, 
      const std::string& server, const std::string& path) 
    : resolver_(io_service), 
    socket_(io_service) 
    { 
     //form request, connection close header server close the socket 
     //std:ostream reuest_stream 


     // Form the request. We specify the "Connection: close" header so that the 
     // server will close the socket after transmitting the response. This will 
     // allow us to treat all data up until the EOF as the content. 
     std::ostream request_stream(&request_); 
     request_stream << "GET " << path << " HTTP/1.0\r\n"; 
     request_stream << "Host: " << server << "\r\n"; 
     request_stream << "Accept: */*\r\n"; 
     request_stream << "Connection: close\r\n\r\n"; 

     // Start an asynchronous resolve to translate the server and service names 
     // into a list of endpoints. 
     //tcp:resolver:query 

     tcp::resolver::query query(server, "http"); 

     resolver_.async_resolve(query, 
           boost::bind(&client::handle_resolve, this, 
              asio::placeholders::error, 
              asio::placeholders::iterator)); 
    } 

private: 


    void handle_read_content(const asio::error_code& err) 
    { 
     if (!err) 
     { 
      // Write all of the data that has been read so far. 
      std::cout << &response_; 

      // Continue reading remaining data until EOF. 
      asio::async_read(socket_, response_, 
          asio::transfer_at_least(1), 
          boost::bind(&client::handle_read_content, this, 
             asio::placeholders::error)); 
     } 
     else if (err != asio::error::eof) 
     { 
      std::cout << "Error: " << err << "\n"; 
     } 
    } 

    tcp::resolver resolver_; 
    tcp::socket socket_; 
    asio::streambuf request_; 
    asio::streambuf response_; 
}; 

답변

1

이 순환되지 않고, 상기 handle_read_content async_read는 동작이 완료 될 때 호출되는 콜백 함수이다. 읽기 작업이 완료 때

  1. 부스트 호출 handle_read_content를 호출 일부 데이터를 읽어

    http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/async_read/overload1.html

    이 여기에, async_read가 작동하는 가정되는 방법은하고있는 것입니다

  2. 새 async_read ...를 호출하고 오류가 발생할 때까지 프로세스가 다시 시작됩니다.
관련 문제