【问题标题】:boost-beast websocket server that also accept http connections也接受 http 连接的 boost-beast websocket 服务器
【发布时间】:2018-07-25 06:57:31
【问题描述】:

我需要使用boost beast 实现一个简单的异步 websocket 服务器,它可以接受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 客户端连接时,服务器会错过发送的第一条消息。 显然,这不是正确的方法:-)

谁能帮我解决这个问题? 谢谢

【问题讨论】:

    标签: c++ boost-beast beast-websockets


    【解决方案1】:

    advanced-serveradvanced-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

    【讨论】:

    • 是否有任何使用野兽的http rest框架的高级服务器实现?这对我需要的东西来说太低了。我需要一个像样的 http 客户端和一种简单的方法来使用处理程序创建休息端点。也许在野兽之上的一些包装器隐藏了我在创建简单的 http 端点时不关心的所有细节?
    • 你说的没错,野兽是低级的,这是本意。如果有人在上面写了一个不错的 REST 框架,那就太好了。我相信它迟早会出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2019-10-06
    • 2021-04-27
    • 2021-10-22
    • 1970-01-01
    • 2020-10-08
    • 2014-09-15
    相关资源
    最近更新 更多