提高异步WebSocket服务器检查客户端信息

3
1个回答

0
在这里,将websocket上的async_accept替换为......
    // Accept the websocket handshake
    ws_.async_accept(
        beast::bind_front_handler(
            &session::on_accept,
            shared_from_this()));

你可以读取一个HTTP请求,然后调用第三个重载

    // read upgrade request
    http::async_read(ws_.next_layer(), buffer_, upgrade_request_,
            beast::bind_front_handler(
                &session::on_upgrade,
                shared_from_this()));

然后在on_run()之外:

http::request<http::string_body> upgrade_request_;

void
on_upgrade(beast::error_code ec, size_t) {
    if(ec)
        return fail(ec, "upgrade");
    // Accept the websocket handshake
    ws_.async_accept(
        upgrade_request_,
        beast::bind_front_handler(&session::on_accept, shared_from_this()));
}

这为您提供了在on_upgrade内执行检查升级请求的机会:

void
on_upgrade(beast::error_code ec, size_t) {
    if(ec)
        return fail(ec, "upgrade");

    std::cout << "Upgrade request user-agent: " << upgrade_request_[http::field::user_agent] << "\n";
    std::cout << "Upgrade request headers: " << upgrade_request_.base() << "\n";
    std::cout << "Upgrade request body: " << upgrade_request_.body() << "\n";

    // Accept the websocket handshake
    ws_.async_accept(
        upgrade_request_,
        beast::bind_front_handler(&session::on_accept, shared_from_this()));
}

使用wscat作为客户端:

wscat -c "ws://localhost:9797/" -H 'User-agent: Slartibartfast' 

导致我们的 Beast 服务器打印出:

Upgrade request user-agent: Slartibartfast
Upgrade request headers: GET / HTTP/1.1
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: o6j5v6YeqI4vEJT6AiVTyA==
Connection: Upgrade
Upgrade: websocket
User-agent: Slartibartfast
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: localhost:9797


Upgrade request body: 

我在使用wss的async_accept时遇到了缓冲区溢出的问题,我尝试了这段代码,似乎解决了这个问题。但现在我遇到了很多崩溃。你有什么想法是为什么吗?@sehe - undefined
@ksohan 是的。代码可能出错了。如果你想要帮助,你应该在问题中展示你的自包含代码。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接