首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

boost asio async_write:如何不交错async_write调用?

在使用Boost.Asio库进行异步编程时,如果需要确保多个async_write操作不交错,可以使用boost::asio::writeboost::asio::async_write函数,并在每次写操作完成后调用回调函数。这样可以确保在写入下一个数据块之前,当前数据块已经完全写入。

以下是一个使用boost::asio::async_write的示例,确保不交错的写入操作:

代码语言:cpp
复制
#include<boost/asio.hpp>
#include<iostream>
#include<vector>
#include<boost/bind.hpp>
#include<boost/enable_shared_from_this.hpp>

class Session : public boost::enable_shared_from_this<Session> {
public:
    Session(boost::asio::io_service& io_service)
        : socket_(io_service) {}

    boost::asio::ip::tcp::socket& socket() {
        return socket_;
    }

    void start() {
        boost::asio::async_write(socket_,
            boost::asio::buffer(data_, data_.size()),
            boost::bind(&Session::handle_write, shared_from_this(),
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred));
    }

private:
    void handle_write(const boost::system::error_code& error,
        size_t bytes_transferred) {
        if (!error) {
            // 写入下一个数据块
            start();
        }
    }

    boost::asio::ip::tcp::socket socket_;
    std::vector<char> data_ = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
};

int main() {
    boost::asio::io_service io_service;

    boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 8080);
    boost::asio::ip::tcp::acceptor acceptor(io_service, endpoint.protocol());
    acceptor.bind(endpoint);
    acceptor.listen();

    boost::asio::ip::tcp::socket socket(io_service);
    acceptor.accept(socket);

    boost::shared_ptr<Session> session(new Session(io_service));
    session->socket() = std::move(socket);
    session->start();

    io_service.run();

    return 0;
}

在这个示例中,我们创建了一个Session类,它包含了一个boost::asio::ip::tcp::socket对象和一个包含数据的std::vector<char>对象。Session类的start方法使用boost::asio::async_write函数异步写入数据,并在写入完成后调用handle_write回调函数。在handle_write回调函数中,我们再次调用start方法,确保下一个数据块在当前数据块写入完成后再写入。

这样,我们就可以确保多个async_write操作不交错,每次写入一个完整的数据块。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

第32章.Boost.Asio-网络编程

一旦另一个程序建立连接,就会调用accept_handler()。如果成功建立连接,则使用 boost::asio::async_write()发送当前时间。此函数将数据中的所有数据写入套接字。...boost::asio::ip::tcp::socket还提供了成员函数async_write_some()。发送至少一个字节后,此函数将调用处理程序。...然后,它必须再次调用async_write_some()。通过使用boost::asio::async_write()可以避免重复计算要发送的剩余字节数并调用async_write_some()。...数据通过boost::asio::buffer()传递给boost::asio::async_write()。...当boost::asio::async_write()和accept_handler()返回时,异步操作已开始,但尚未完成。数据必须存在,直到异步操作完成。如果数据是全局变量,则可以保证。

2.6K41

Boost asio 心得笔记

Boost asio中有两点用的不爽: 1. asio中的所有对象都引用io_service 2. async_write还要自己保证内存在completed之前有效 有空要把这两点搞的更傻瓜一点,实际上在全异步模式下...NET IO分配两个线程足矣,async搞一个队列,completed时候删掉,还可以通过writev优化写, 现在在做的一个redrabbit lib 就是在boost asio上封装的更傻瓜一点。...code.google.com/p/redrabbit/source/browse/#svn%2Ftrunk 如果再有空,想自己封装一下epoll, 不考虑移植性,很少的模板,比较简单的类关系, 看了一下asio...源码,其思路不是很复杂,但是为考虑移植性,使用了大量的模板和ifdef,可读性稍差, 我常常意识到,即使使用boost asio这样的proactor模式的io库,TCP编程仍然还是复杂,需要了解好多技术细节

1.9K70
  • FF ASIO 异步消息网络框架

    在前边 https://cloud.tencent.com/developer/article/1056482 我提到,针对前面使用boost asio 中遇到的问题,对asio进行封装,如下几个目标:...创建socket、acceptor不再自己构造io_service,由于asio中的对象均要保存io_service的引用,   若要手动构造,必须保证io_service晚于所有的asio对象(如socket...编写分布式程序时,都是采用异步消息,但是asio 中对socket进行async_write不能保证线程安全,而且我们必须保证在单个socket上发送数据   必须是顺序的。...个效率最佳,在增加线程并不能增大吞吐量,这是由于asio采用全异步模式。...所以我们只需要开启两个专门的线程给asio的io_service用即可,   省了在关心线程的分配。 4.

    1.4K30

    TiKV 源码解析系列文章(十一)Storage - 事务控制层

    调用者把要写的内容交给 async_writeasync_write 通过回调的方式告诉调用者写操作成功完成了或者遇到错误了。...当调用 RaftKV 的 async_write 进行写入操作时,如果 async_write 通过回调方式成功返回了,说明写入操作已经通过 raft 复制给了大多数副本,并且在 leader 节点(调用者所在...worker_pool,high_priority_pool:两个线程池,写请求在调用 engine 的 async_write 之前需要进行事务约束的检验工作,这些工作都是在这个两个线程池中执行的。...当判断 prewrite 是可以执行的,会调用 engine 的 async_write 接口执行真正的写入操作。...5)当 async_write 执行成功或失败之后,会调用 Scheduler 的 release_lock 函数来释放 latch 并且唤醒等待在这些 latch 上的请求继续执行。 5.

    70931

    TiKV 源码解析系列文章(十一)Storage - 事务控制层

    调用者把要写的内容交给 async_writeasync_write 通过回调的方式告诉调用者写操作成功完成了或者遇到错误了。...当调用 RaftKV 的 async_write 进行写入操作时,如果 async_write 通过回调方式成功返回了,说明写入操作已经通过 raft 复制给了大多数副本,并且在 leader 节点(调用者所在...worker_pool,high_priority_pool:两个线程池,写请求在调用 engine 的 async_write 之前需要进行事务约束的检验工作,这些工作都是在这个两个线程池中执行的 prewrite...当判断 prewrite 是可以执行的,会调用 engine 的 async_write 接口执行真正的写入操作。...5)当 async_write 执行成功或失败之后,会调用 Scheduler 的 release_lock 函数来释放 latch 并且唤醒等待在这些 latch 上的请求继续执行。 5.

    72110

    C++ 中文周刊 2024-01-26 第147期

    RSS https://github.com/wanghenshui/cppweeklynews/releases.atom 欢迎投稿,推荐或自荐文章/软件/资源/批评互动等等 请后台留言 本期文章由 语...bounded-dynamicism-with-cross-modifying-code/ 也是类似的玩意,也有现成的库提供,https://github.com/backtrace-labs/dynamic_flag 分享一个asio...下使用channel来实现无需队列的安全的连续async_write的方法 https://zhuanlan.zhihu.com/p/679175397 不明觉厉 Detecting multiple...新的scope库被合入 https://lists.boost.org/Archives/boost/2024/01/255717.php • seastar 最近改动较少 主要是代码规范化 比如 https...://github.com/scylladb/seastar/pull/2054 另外就是修复bug,延长请求,请求没结束释放handler https://github.com/scylladb/seastar

    12410

    MongoDB网络传输层模块源码实现二

    说明 在之前的>一文中分析了如何阅读百万级大工程源码、Asio网络库实现、transport传输层网络模块中线程模型实现,但是由于篇幅原因...::split(listenAddrs, _listenerOptions.ipList, boost::is_any_of(","), boost::token_compress_on);...、opportunisticWrite(..)分别完成套接字处理、调用asio库接口实现底层数据读和底层数据写。...如果是同步线程模型(一个链接一个线程),则读写方式位阻塞读写;如果是异步线程模型(adaptive动态线程模型),则调用asio网络库接口实现异步读写。...::write()发送成功后才返回;异步模式发送为非阻塞写,asio::write()不一定全部发送出去,因此需要再次调用asio库的asio::async_write()进行异步发送。

    1.4K20

    C++中消息自动派发之三 About JSON Encode

    代表此消息为响应消息,服务器不需要处理此消息的请求      对应的服务器实现代码如下所示,稍微做些解释:   1> socket_t 封装linux socket 文件描述符操作,这里只是个示例,其提供async_write...消息体基类支持encode接口,讲二进制struct转成json字符串,socket则将json字符串通过write系统调用发送给client。   ...3> msg_dispather_t, 这个类是由idl 解析器自动生成的,在生产环境,应该有网络层调用此对象。由于本文只是示例,故忽略网络层,由main模拟网络层调用。...class socket_t { public: void async_write(msg_ptr_t msg_) { //!...allocator); out.encode("friends", dest, friends); return 0; } }; 3. encode 和 decode 如何实现

    1.5K50

    eos源码赏析(四):基于boost::asio的httpserver架构

    Boost::asio简介 首先我们来看cleos的main.cpp中,不管是交易还是获取钱包、获取账户的状态等功能都会调用一个函数do_http_call,在5月5日eos-master中最新的更新记录中...是如何实现的?让我们对他一探究竟。跳转到do_http_call这个函数,我们可以看到其实这个函数是基于boost::asio实现的一个httpserver,供cleos的http通信使用....Boost::asio是一种跨平台的主要用于网络和其他一些底层输入/输出的C++库。Boost::asio在网络通信、COM串行端口和文件上成功的抽象了输入输出的概念。...Boost::Asio基本框架如图1所示: 图2 Boost::Asio基本框架 使用者启动一个异步操作,同时创建一个异步回调的对象。...先从eos命令行工具入手,查看cleos网络通信的实现,并具体到boost::asio如何实现一个httpserver的,最后基于boost::asio和qt界面库,做一个小工具用来测试http post

    1.5K40

    C++ Boost 实现异步端口扫描器

    本章我们将运用Boost框架实现一个基于TCP的扫描工具,TCP端口扫描是一种常见的网络扫描技术,通过发送TCP连接请求来确定目标系统上的端口是否开放,其本质上是通过调用Socket套接字中的connect...本文将介绍如何使用Boost.Asio实现异步连接,以及如何设置超时机制,确保连接在规定的时间内建立。AsioBoost库中的一个模块,用于异步I/O和网络编程。...Boost.Asio支持TCP、UDP、SSL等协议,使得开发者能够轻松实现异步网络通信。...std; using boost::asio::ip::tcp; // 异步连接地址与端口 class AsyncConnect { public: AsyncConnect(boost::asio...) { return false; } std::system("pause"); return 0; } 通过本文的示例,我们展示了如何使用Boost.Asio创建异步连接,

    37510
    领券