Сервер веб-сокета boost-beast, который также принимает http-соединения

Мне нужно реализовать простой асинхронный сервер веб-сокета, используя boost beast который может принимать как websocket, так и стандартные http-соединения.

Я пробовал что-то вроде этого:

...

// ws is a boost::beast::websocket::stream<boost::asio::ip::tcp::socket>
ws.async_accept_ex(
  [](boost::beast::websocket::response_type& res)
  {
    res.set(boost::beast::http::field::server, "MyServer");
  },
  [self](boost::beast::error_code e)
  { 
    if (e) self->ReadHttp();
    else self->ReadWs();
  }
);
...

void ReadHttp()
{
  auto self(shared_from_this());
  ws.next_layer().async_read_some(
    boost::asio::buffer(data, max_length),
    [self](boost::system::error_code ec, std::size_t length)
    {
      if (!self->ws.next_layer().is_open() || ec==boost::asio::error::eof ||  ec == boost::asio::error::connection_reset)
        // handle disconnection
      else if (ec)
        // handle error
      else
      {
        std::string s(self->data, length);
        cout << "HTTP rx: " << s << endl;
        self->ReadHttp();
      }
    }
  );
}

void ReadWs()
{
  auto self(shared_from_this());
  ws.async_read(
    rxData,
    [self](boost::beast::error_code ec, std::size_t /*length*/)
    {
      if(ec == boost::beast::websocket::error::closed)
        // handle disconnection
      else if ( ec )
        // handle error
      else
      {
        std::string s((std::istreambuf_iterator<char>(&self->rxData)), std::istreambuf_iterator<char>());
        cout << "WS rx: " << s << endl;
        self->rxData.consume(self->rxData.size());
        self->Read();
      }
    }
  );
}

но когда подключается HTTP-клиент, сервер пропускает первое отправленное сообщение. Очевидно, это не правильный подход:-)

Кто-нибудь может мне с этим помочь? Спасибо

1 ответ

Решение

Примеры advanced-server и advanced-server-flex демонстрируют, как создать сервер, который обрабатывает обычные HTTP-запросы, а также обрабатывает запрос на обновление WebSocket:

https://github.com/boostorg/beast/tree/e23ecc8ac903b303b9d1a9824b97c092cb3c09bd/example/advanced/server

https://github.com/boostorg/beast/tree/e23ecc8ac903b303b9d1a9824b97c092cb3c09bd/example/advanced/server-flex

Другие вопросы по тегам