beast async_read() 是如何工作的?是否有相应的选项?
How does beast async_read() work & is there an option for it?
我对 boost::asio
的基础知识不是很熟悉。我正在处理连接到 Web 服务器并读取响应的任务。响应在随机时间段抛出,即 响应生成时。
为此,我正在使用 boost::beast
库,它涵盖了 boost::asio
基础知识。
我发现 async_read()
函数正在等待接收响应。
现在,问题是:在 documentations & example 中显示了 websocket 通信的异步方式,其中 websocket 在收到响应后关闭。
这是通过 此代码(野兽文档)完成的:
void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
boost::ignore_unused(bytes_transferred);
if(ec)
return fail(ec, "write");
// Read a message into our buffer
ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
void close_ws_(boost::system::error_code ec, std::size_t bytes_transferred) {
boost::ignore_unused(bytes_transferred);
if(ec)
return fail(ec, "read");
// Close the WebSocket connection
ws_.async_close(websocket::close_code::normal, std::bind(&session::on_close, shared_from_this(), std::placeholders::_1));
}
在这个程序中假设在接收之前发送完成。并且只有一次来自服务器的响应。之后,它(客户端)继续并关闭 websocket。
但是在我的程序中:
我必须检查写入部分是否已经结束,如果没有,在写入过程中 websocket 应该来检查到目前为止写入的任何内容的响应。
现在为此,我设置了一个 if else 来告诉我的程序我的写作是否完成了?如果没有,那么程序应该回到写入部分并写入所需的东西。如果是,则关闭连接。
void write_bytes(//Some parameters) {
//write on websocket
//go to read_resp
}
void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
boost::ignore_unused(bytes_transferred);
if(ec)
return fail(ec, "write");
// Read a message into our buffer
if (write_completed){
ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
} else {
ws_.async_read(buffer_, std::bind(&session::write_bytes, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
}
void close_ws_(//Some parameters) {
//Same as before
}
现在我要做的是,写入完成后等待3秒,每隔1秒读取一次websocket ,并在第 3 秒后关闭 websocket。
为此,我又添加了一个 if else 来检查 read_resp
的 3 秒条件
void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
boost::ignore_unused(bytes_transferred);
if(ec)
return fail(ec, "write");
// Read a message into our buffer
if (write_completed){
if (3_seconds_completed) {
ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
} else {
usleep(1000000); //wait for a second
ws_.async_read(buffer_, std::bind(&session::read_resp, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
} else {
ws_.async_read(buffer_, std::bind(&session::write_bytes, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
}
但是 websocket 正在等待 async-read
接收某些东西,这样做只会导致会话超时。
如何只查看是否有可读内容然后继续执行回调?
这可能只是我这里问题的答案。我不能保证为未来的读者提供解决方案。
我已经删除了 read_resp()
自循环,只是让 async_read()
在 write_completed == true
时移动到 close_ws_
。
async_read只要收到响应就会一直等待,不会继续下一步,从而导致超时。
我对 boost::asio
的基础知识不是很熟悉。我正在处理连接到 Web 服务器并读取响应的任务。响应在随机时间段抛出,即 响应生成时。
为此,我正在使用 boost::beast
库,它涵盖了 boost::asio
基础知识。
我发现 async_read()
函数正在等待接收响应。
现在,问题是:在 documentations & example 中显示了 websocket 通信的异步方式,其中 websocket 在收到响应后关闭。
这是通过 此代码(野兽文档)完成的:
void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
boost::ignore_unused(bytes_transferred);
if(ec)
return fail(ec, "write");
// Read a message into our buffer
ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
void close_ws_(boost::system::error_code ec, std::size_t bytes_transferred) {
boost::ignore_unused(bytes_transferred);
if(ec)
return fail(ec, "read");
// Close the WebSocket connection
ws_.async_close(websocket::close_code::normal, std::bind(&session::on_close, shared_from_this(), std::placeholders::_1));
}
在这个程序中假设在接收之前发送完成。并且只有一次来自服务器的响应。之后,它(客户端)继续并关闭 websocket。
但是在我的程序中:
我必须检查写入部分是否已经结束,如果没有,在写入过程中 websocket 应该来检查到目前为止写入的任何内容的响应。
现在为此,我设置了一个 if else 来告诉我的程序我的写作是否完成了?如果没有,那么程序应该回到写入部分并写入所需的东西。如果是,则关闭连接。
void write_bytes(//Some parameters) {
//write on websocket
//go to read_resp
}
void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
boost::ignore_unused(bytes_transferred);
if(ec)
return fail(ec, "write");
// Read a message into our buffer
if (write_completed){
ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
} else {
ws_.async_read(buffer_, std::bind(&session::write_bytes, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
}
void close_ws_(//Some parameters) {
//Same as before
}
现在我要做的是,写入完成后等待3秒,每隔1秒读取一次websocket ,并在第 3 秒后关闭 websocket。
为此,我又添加了一个 if else 来检查 read_resp
void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
boost::ignore_unused(bytes_transferred);
if(ec)
return fail(ec, "write");
// Read a message into our buffer
if (write_completed){
if (3_seconds_completed) {
ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
} else {
usleep(1000000); //wait for a second
ws_.async_read(buffer_, std::bind(&session::read_resp, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
} else {
ws_.async_read(buffer_, std::bind(&session::write_bytes, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
}
但是 websocket 正在等待 async-read
接收某些东西,这样做只会导致会话超时。
如何只查看是否有可读内容然后继续执行回调?
这可能只是我这里问题的答案。我不能保证为未来的读者提供解决方案。
我已经删除了 read_resp()
自循环,只是让 async_read()
在 write_completed == true
时移动到 close_ws_
。
async_read只要收到响应就会一直等待,不会继续下一步,从而导致超时。