如何查看有关 async_accept 失败的原始 tcp 数据?
Posted
技术标签:
【中文标题】如何查看有关 async_accept 失败的原始 tcp 数据?【英文标题】:How to see raw tcp data on async_accept failure? 【发布时间】: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函数失败时,我可以知道传递的数据吗?
如果我想的都不可能,这个问题怎么解决?
【问题讨论】:
【参考方案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)。
【讨论】:
以上是关于如何查看有关 async_accept 失败的原始 tcp 数据?的主要内容,如果未能解决你的问题,请参考以下文章
boost::asio::async_accept 处理程序未被调用
有关链接器命令的错误失败,退出代码为 1(使用 -v 查看调用)
boost::asio async_accept 杀死 ioservice
boost::asio::ip::tcp::acceptor 在使用 async_accept 接收连接请求时终止应用程序