如何在 async_accept 失败时查看原始 tcp 数据?
How to see raw tcp data on async_accept failure?
我正在为 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(...);
}
接受功能失败后,我尝试读取原始的tcp数据,但是我无法知道传递的数据。我只能通过 ec.message() 知道失败原因。当accept函数失败时,我能知道传递的数据吗?
如果我想的不可能,怎么解决这个问题?
我找到了解决方案。
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).
我正在为 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(...);
}
接受功能失败后,我尝试读取原始的tcp数据,但是我无法知道传递的数据。我只能通过 ec.message() 知道失败原因。当accept函数失败时,我能知道传递的数据吗?
如果我想的不可能,怎么解决这个问题?
我找到了解决方案。
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).