加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Boost ASIO:异步写入,同步

发布时间:2020-12-16 07:21:13 所属栏目:百科 来源:网络整理
导读:我有一个程序(客户端服务器),该编写没有问题: 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 :: s
我有一个程序(客户端服务器),该编写没有问题:

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));

这个功能的目的是:

>本质上使调用异步
>保持接口不变

我实现的函数只是使用promise / future来模拟同步行为,稍后我会修改它(在它工作之后)可以取消:

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()?

解决方法

回覆.编辑:

你有正确的io_service :: run().这告诉我你在(完成)处理程序中阻止未来.显然,这会阻止run()进行事件循环.

@florgeng提出的问题不是你是否有一个io_service实例.

问题是你是否正在调用run()(或poll()),以便继续执行异步操作.

此外,您已经可以使用future<>内置:

> http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/overview/cpp2011/futures.html
>示例:http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp

std::future<std::size_t> recv_length = socket.async_receive_from(
      boost::asio::buffer(recv_buf),sender_endpoint,boost::asio::use_future);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读