2010-01-22 2 views
2

나는 아주 부스트를 향상시켰다. 크로스 플랫폼 저수준 C++ 네트워크 API가 필요 했으므로 asio를 선택했습니다. 이제는 성공적으로 소켓에 연결하고 작성했지만 비동기 읽기/쓰기를 사용하고 있기 때문에 요청을 추적 할 수있는 방법이 필요합니다 (필요한 경우 일종의 ID 보유). 설명서/참조를 살펴 봤는데 사용자 데이터를 처리기에 전달할 방법이 없다는 것을 알았습니다. 콜백으로 작동하고 ID를 추적하여 전달하는 특수 클래스를 만드는 것이 유일한 방법입니다. 콜백으로 소켓에 연결합니다. 더 좋은 방법이 있습니까? 아니면 그것을하는 가장 좋은 방법은 무엇입니까?소켓 및 사용자 값에 대한 비동기 쓰기 (boost :: asio 질문)

답변

3

async_xxx 함수는 완료 핸들러 유형에 템플리트 화됩니다. 핸들러는 일반 "콜백"일 필요는 없으며 올바른 operator() 시그니처를 표시하는 것이 될 수 있습니다.

당신은 따라서 같은 것을 할 수 있어야한다 :

// Warning: Not tested 
struct MyReadHandler 
{ 
    MyReadHandler(Whatever ContextInformation) : m_Context(ContextInformation){} 

    void 
    operator()(const boost::system::error_code& error, std::size_t bytes_transferred) 
    { 
     // Use m_Context 
     // ...    
    } 

    Whatever m_Context; 
}; 

boost::asio::async_read(socket, buffer, MyReadHander(the_context)); 

또는, 당신은 또한 일반 함수로 핸들러를 가질 수와 asio tutorial에 설명 된대로 호출 사이트에 바인딩합니다. 위의 예는 다음과 같습니다.

void 
HandleRead(
    const boost::system::error_code& error, 
    std::size_t bytes_transferred 
    Whatever context 
) 
{ 
    //... 
} 

boost::asio::async_read(socket, buffer, boost::bind(&HandleRead, 
    boost::asio::placeholders::error_code, 
    boost::asio::placeholders::bytes_transferred, 
    the_context 
)); 
+0

고마워요! 그것은 완벽하게 작동했습니다. – fingerprint211b

관련 문제