【问题标题】:How to see raw tcp data on async_accept failure?如何查看有关 async_accept 失败的原始 tcp 数据?
【发布时间】:2019-11-30 01:58:48
【问题描述】:

我正在为 WebSocket 和 TCP 服务器使用 boost::beast 库。

由于要求,我必须使用相同的端口。因此我在它之后实现了服务器。

        void on_run() {
            // Set suggested timeout settings for the websocket
            m_ws.set_option(...);
            m_ws.async_accept(
                beast::bind_front_handler(
                    &WsSessionNoSSL::on_accept,
                    shared_from_this()));
        }

        virtual void on_accept(beast::error_code ec) {
            if(ec) {
                std::string msg = ec.message();
                CONSOLE_INFO("err: {}", msg);
                if(msg != "bad method") {
                    return fail(ec, "accept"); 
                } else {
                    doReadTcp();
                    return;
                }
            }          
            doReadWs();
        }
        void doReadTcp() {   
 m_ws.next_layer().async_read_some(boost::asio::buffer(m_recvData, 15),
                            [this, self = shared_from_this()](const boost::system::error_code &error,
                                                              size_t bytes_transferred) {
                                if(error) {
                                    return fail(error, "tcp read fail");
                                }
                                CONSOLE_INFO("recvs: {}", bytes_transferred);
                                doReadTcp();
                            });
        }
        void doReadWs() {
            m_ws.async_read(...);
        }

accept 函数失败后,我尝试读取原始 tcp 数据,但是我无法知道传递的数据。我只能通过 ec.message() 知道失败原因。当accept函数失败时,我可以知道传递的数据吗?

如果我想的都不可能,这个问题怎么解决?

【问题讨论】:

    标签: c++ boost beast


    【解决方案1】:

    我找到了解决办法。

                m_ws.async_accept(net::buffer(m_untilStr),
                    beast::bind_front_handler(
                        &WsSessionNoSSL::on_accept,
                        shared_from_this()));
    

    websocket::stream 支持缓冲接受功能。

    因此首先tcp socket填充握手数据,调用async_accept(buffer, handler)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      相关资源
      最近更新 更多