【发布时间】:2021-03-10 13:44:56
【问题描述】:
我正在尝试使用boost::asio 编写服务器,但我希望boost::asio::async_read 操作在没有数据到来时超时,但我知道该怎么做。
这是我目前的代码
void do_read_header() {
auto self(shared_from_this());
std::cout << "do_read_header\n";
boost::asio::async_read(
socket_, boost::asio::buffer(res.data(), res.header_length),
[this, self](boost::system::error_code ec,
std::size_t length) {
if (!ec && res.decode_header()) {
do_read_body();
}
});
do_write();
}
void do_read_body() {
auto self(shared_from_this());
Message msg;
std::cout << "do_read_body\n";
boost::asio::async_read(
socket_, boost::asio::buffer(res.body(), res.body_length()),
[this, self](boost::system::error_code ec,
std::size_t length) {
if (!length) {
return;
}
if (!ec) {
try {
std::cout << "read " << res.body() << "\n";
request_queue_.send(res.body(), res.body_length(),
0);
} catch (const std::exception& ex) {
std::cout << ex.what() << "\n";
}
} else {
if (ec) {
std::cerr << "read error:" << ec.value()
<< " message: " << ec.message() << "\n";
}
socket_.close();
}
do_read_header();
});
}
void start() {
post(strand_, [this, self = shared_from_this()] {
do_read_header();
do_write();
});
}
class Server {
public:
Server(boost::asio::io_service& io_service, short port)
: acceptor_(io_service, tcp::endpoint(tcp::v4(), port)),
socket_(io_service) {
do_accept();
}
private:
void do_accept() {
acceptor_.async_accept(
socket_, [this](boost::system::error_code ec) {
if (!ec) {
std::cout << "accept connection\n";
std::make_shared<Session>(std::move(socket_))
->start();
}
do_accept();
});
}
tcp::acceptor acceptor_;
tcp::socket socket_;
};
【问题讨论】:
-
取决于你想在超时后做什么。是否要关闭套接字?
-
不,我想转到
do_write()函数 -
听起来你想要一个deadline timer and
async_wait。然后根据哪个处理程序采取适当的行动——计时器或读取操作。 -- 首先被调用。 -
您可能应该只发布自包含代码。我有一种非常独特的感觉,我以前看过这段代码,但我又花了很多时间让它完整。如果我可以通过猜测来做到这一点,也许你应该能够做到:)
标签: c++ boost boost-asio