我有一个程序(客户端+服务器),这个写法能正常工作,没有任何问题:
boost::asio::write(this->socket_, boost::asio::buffer(message.substr(count,length_to_send)));
其中socket_
是boost::asio::ssl::stream<boost::asio::ip::tcp::socket>
,message
是一个std::string
。
我希望让它更好,并且非阻塞,所以我创建了一个可以替换它的函数,调用方式如下:
write_async_sync(socket_,message.substr(count,length_to_send));
这个函数的目的是:
- 内在地使调用异步化
- 保持接口不变
std::size_t
SSLClient::write_async_sync(boost::asio::ssl::stream<boost::asio::ip::tcp::socket>& socket,
const std::string& message_to_send)
{
boost::system::error_code write_error;
std::promise<std::size_t> write_promise;
auto write_future = write_promise.get_future();
boost::asio::async_write(socket,
boost::asio::buffer(message_to_send),
[this,&write_promise,&write_error,&message_to_send]
(const boost::system::error_code& error,
std::size_t size_written)
{
logger.write("HANDLING WRITING");
if(!error)
{
write_error = error;
write_promise.set_value(size_written);
}
else
{
write_promise.set_exception(std::make_exception_ptr(std::runtime_error(error.message())));
}
});
std::size_t size_written = write_future.get();
return size_written;
}
问题:我无法让异步功能正常工作。同步功能正常,但异步却会冻结并且永远不会进入lambda部分(写入从未发生)。我做错了什么?
编辑:我意识到使用
poll_one()
会使函数执行并继续进行,但我不理解它。这是我为io_service
调用run()
的方式(在启动客户端之前):io_service_work = std::make_shared<boost::asio::io_service::work>(io_service);
io_service_thread.reset(new std::thread([this](){io_service.run();}));
基本上这些是 shared_ptr
。这样做有问题吗?这种方式是否需要使用 poll_one()
?
write
时,齿轮运转良好。但异步调用则存在问题。在构造函数中将io_service
传递给socket_
。 - Sam Markus