2015-01-27 3 views
0

으로 전체 내용을 읽으겠습니다. Boost.ASIO를 사용하여 간단한 WebSocket 서버를 작성하고 있습니다. 지금 나는 악수를 처리하려고 노력 중이다. 내 문제는 클라이언트에서 보낸 핸드 셰이크 메시지의 길이가 미리 정의 된 것처럼 보이지 않는다는 것입니다.Boost.ASIO [WebSocket]

제 질문은 메시지가 끝날 때 핸드 셰이크를 읽지 않으려면 어떻게합니까?

먼저 지정된 바이트 수만큼 읽은 async_read_some을 시도했습니다.

void Connection::readMessage() 
{ 
    auto self(shared_from_this()); 
    w_socket.async_read_some(boost::asio::buffer(w_data, max_length), 
     [this, self](boost::system::error_code ec, std::size_t length) // Lambda function 
     { 
      if (!ec) 
      { 
       std::cout << w_data << std::endl; 
      } 
     }); 
} 

위의 코드는 나에게이 결과 준 : 그럼 http://i.imgur.com/LSyfG2U.png

내가 더 조회는 시도를 발견 일시적으로 핸드 셰이크 메시지를 수정 (연속 신규 라인까지 읽기가 건)이 async_read_until을하지만, 그것은 그것이 멈추는 것을 보장하지 않습니다. 위의 코드는이 결과 준

void Connection::readMessage() 
{ 
    auto self(shared_from_this()); 
    boost::asio::async_read_until(w_socket, streambuffer, "\r\n\r\n", 
     [this, self](boost::system::error_code ec, std::size_t length) // Lambda function 
     { 
      if (!ec) 
      { 
       std::istream is(&streambuffer); 
       std::getline(is, w_data_s); 

       std::cout << w_data_s << std::endl; 
      } 
     }); 
} 

: http://i.imgur.com/JW1dyLH.png

또는 어쩌면 더 나은 질문 (dataframes 핸드 셰이크 메시지를 처리하는 가장 좋은 것입니다 어느 악수를 통과 한 후 일반 메시지를 처리하는 가장 좋은 것입니다있는 것 및 물건).

답변

1

여기 웹 소켓 사양을 살펴보면 : http://datatracker.ietf.org/doc/rfc6455/?include_text=1 당신은 올바른 길을 가고 있습니다.

async_read_until을 사용하여 길이가 정의되지 않았지만 http와 동일하게 구분 된 핸드 셰이크를 처리 한 다음 핸드 셰이크를 완료 한 후 실제 데이터 교환을 위해 개인적으로 async_read를 사용하여 고정 된 미리 정의 된 헤더 길이는 후속 본문의 길이를 설명하거나 자신의 완료 조건을 지정합니다. 물론 고정 된 방식으로 메시지를 구분하지 않으려면 async_read_until을 계속 사용할 수 있습니다.

+0

고마워요, 올리버. async_read_until을 사용하는 것에 대해 질문 한 유일한 이유는 독자가 끝까지 읽지 않으려 고하는 방식을 사용하여 누군가를 악용하려는 느낌이 들기 때문입니다. 하지만 이러한 공격을 막기 위해 타임 아웃 타이머를 추가하는 것이 좋습니다. – Evan