首页
Python
Java
前端
数据库
Linux
Chatgpt专题
开发者工具箱
asio专题
ASIO网络调试助手之一:简介
多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依
阅读更多...
asio之服务的理解
服务组件 asio中的服务抽象为io_service::service #mermaid-svg-artyBUb0hnZdT3xh {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-artyBUb0hnZdT3xh .error-icon{fill:#552
阅读更多...
asio之互斥量,条件变量和本地存储封装
简介 asio对于封装了多线程中的线程,互斥量,条件变量以及本地存储,线程在asio之thread已有介绍,本方只介绍互斥量,条件变量和本地存储 互斥量 asio实现了不同平台的互斥量,并且使用别名来统一互斥量,主要有 posix_mutexwin_mutexstd_mutexnull_mutex #if !defined(BOOST_ASIO_HAS_THREADS)typedef
阅读更多...
boost::asio 库版本,C/C++代码编译兼容性
1、boost::asio::spawn 开启有栈(stackful)协同程序,版本改进及限制 >= boost_1_80 版本应采用以下方式。 auto f = [self, this](const boost::asio::yield_context& y) noexcept {bool success_ = do_handshake(y);if
阅读更多...
asio之thread
简介 asio针对不同平台实现了线程,有null_thread,wince_thread,win_thread,posix_thread和std_thread 结构 线程实现的结构大致相同,以posix_thread为例 #mermaid-svg-FI6HkxjHNpfZq1Zl {font-family:"trebuchet ms",verdana,arial,sans-serif;
阅读更多...
[16 使用C++11开发一个简单的通信程序(Proactor模式)] 16.5 C++11结合asio实现一个简单的客户端程序
客户端的需求:具备读/写能力,能自动重连。 自动重连用一个线程去检测,读/写能力复用RWHandler。 客户端的实现如下: class Connector{public:Connector(io_service& ios, const string& strIP, short port) : m_ios(ios), m_socket(ios), m_serverAddr(tcp::en
阅读更多...
[16 使用C++11开发一个简单的通信程序(Proactor模式)] 16.4 C++11结合asio实现一个简单的服务端程序
需求:服务端监听某个端口,允许多个客户端连接上来,打印客户端发来的数据。 (1)能接收多个客户端。 考虑用一个map来管理socket,每次有新连接时,服务器自动分配一个连接号给这个连接,以方便管理。socket不允许复制,不能直接将socket放到map里,需要外面封装一层。 (2)打印客户端的数据,需要异步读数据。 为简化操作,将socket封装到一个读/写事件处理器中。这时采用同步写
阅读更多...
[16 使用C++11开发一个简单的通信程序(Proactor模式)] 16.3 asio的基本用法
asio的异步操作过程如下:(asio的全称为Asynchronous input and output(异步输入输出)的缩写) 图16-7 asio的异步操作过程 (1)应用程序发起了一个异步请求(异步读或写),需要提供socket或异步操作完成函数。 (2)asio的io_object对象会将这个异步请求交给操作系统,由操作系统完成该请求。 (3)调用io-service::run
阅读更多...
boost库asio详解8——几个TCP的简单例子
摘于boost官网的几个例子, 做了点小修改, 笔记之. 同步客户端 [cpp] view plain copy print ? void test_asio_synclient() { typedef boost::asio::io_service IoService; // 该命名空间下有几个常用类: accetpt, resolver,
阅读更多...
boost库asio详解5——resolver与endpoint使用说明
tcp::resolver一般和tcp::resolver::query结合用,通过query这个词顾名思义就知道它是用来查询socket的相应信息,一般而言我们关心socket的东东有address,port而已,通过tcp::resolver很容易实现设置和查询,它通过query把字符串格式的ip如192.168.0.200或主机名http://localhost,端口“8080”等转化成so
阅读更多...
boost库asio详解4——deadline_timer使用说明
deadline_timer和socket一样,都用io_service作为构造函数的参数。也即,在其上进行异步操作,都将导致和io_service所包含的iocp相关联。这同样意味着在析构 io_service之前,必须析构关联在这个io_service上的deadline_timer。 1. 构造函数 在构造deadline_timer时指定时间。 [cpp] view
阅读更多...
boost库asio详解3——io_service作为work pool
无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE。 使用io_service作为处理工作的work pool,可以看到,就是通过io_service.post投递一个Handler到io_service的队列,Handler在这个io_service.run内部得到执行,有可能你会发现,io_services.
阅读更多...
boost库asio详解2——io_service::run函数无任务时退出的问题
io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁。 [cpp] view plain copy print ? void test_asio_nowork() { boost::asio::io_service ios; PRINT_DEBUG("ios before
阅读更多...
boost库asio详解1——strand与io_service区别
[cpp] view plain copy print ? namespace { // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. // io_service不能保证线程安全 boost::asio::io_service m_service; boost:
阅读更多...
boost.asio 学习笔记07——总结
至此,我们对boost.asio的基本体系结构以及在windows上的实现,做了一个梳理;个人认为常用到的操作及其实现都涉及到了。当然,本文并没有对非Win环境下的实现、SSL,串口、buffer管理、以及如何使用asio等进行讨论。 针对asio,个人也是刚刚接触正在学习,觉得要想使用好他,还是首先要了解socket的基本操作,在windows环境下,还要了解IOCP模型,然后才能用好它。
阅读更多...
boost.asio 学习笔记06——其他
asnyc_read VS. async_read_some VS. async_receive async_read是一个全局函数;后面两个则于ip::tcp::socket的成员个函数;都可以用来异步读取操作,他们有什么样的差别呢。先来看async_read_some和async_receive,他们的文档说明如下: async_read_some: Start an asynchrono
阅读更多...
boost.asio 学习笔记05——asio的windows实现
Operation 还记得前面我们在分析resolver的实现的时候,挖了一个关于operation的坑?为了不让自己陷进去,现在来填吧;接下来我们就来看看asio中的各种operation。 和前面提到过的service的类似,这里的operation也分为两大系:IOCP Enable和Disable系列。这里我们重点关注下图中红色部分表示的IOCP Enable系列operation
阅读更多...
boost.asio 学习笔记04——asio的体系结构
三层类关系图 根据前面的分析,我们知道asio有着这样的逻辑: 参考STL,提供basic模版,对外使用basic模版的实例提供接口。 basic模版将具体操作委托给下层服务类完成。 下层服务类再把操作委托给平台相关的服务类。 鉴于此,我们将asio体系划分为三层:io object层,basic_ 模版类层,服务层。 第一层:io object层,作为应用程序直接使用的对象,是各种b
阅读更多...
boost.asio学习笔记03——io objects
asio的文档,告诉我们在声明一个io_service对象之后,就可以创建io对象去干活了,例如: int main(int argc, char* argv[]) { boost::asio::io_service io_service; tcp::resolver resolver(io_service); tcp::resolver::query query("www.boost.o
阅读更多...
boost.asio 学习笔记02——io_service类
从第一个boost.asio的教程开始,boost文档就一直在告诉我们:使用boost.asio第一步就是要创建一个io_service对象。那么io_service是个什么东西呢? boost.asio文档说,io_service为下面的这些异步IO对象提供最核心的IO功能: boost::asio::ip::tcp::socket boost::asio::ip::tcp::accep
阅读更多...
boost.asio 学习笔记01——概述
boost.asio为异步IO提供了一份标准的C++的跨平台实现,特别针对网络IO提供了良好的支持,使之成为C++网络编程利器。关于如何使用asio,boost文档中已经有了详尽说明,而且附带的例子也很直观,我们不必再造轮子;本文则结合asio的基本应用,侧重于源代码的分析,特别是针对windows平台上的实现进行分析。 纵观asio源码,在统一的接口层之下,asio提供了大量的类来支持不同的
阅读更多...
boost::asio::Io_service strand
构造函数 构造函数的主要动作就是调用CreateIoCompletionPort创建了一个初始iocp。 Dispatch和post的区别 Post一定是PostQueuedCompletionStatus并且在GetQueuedCompletionStatus 之后执行。 Dispatch会首先检查当前thread是不是io_service.run/runonce/poll/p
阅读更多...
【Boost】boost库asio详解1——strand与io_service区别
转载于http://blog.csdn.net/huang_xw/article/details/8469851 [cpp] view plain copy print ? namespace { // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. // io_service不能保
阅读更多...
boost库asio详解7——boost::asio::buffer用法
1. asio::buffer常用的构造方法 asio::buffer有多种的构造方法,而且buffer大小是自动管理的 1.1 字符数组 [cpp] view plain copy print ? char d1[128]; size_t bytes_transferred = socket.receive(boost::asio::buffer(d1));
阅读更多...
boost库asio详解6——boost::asio::error的用法浅析
1. 概述 一般而言我们创建用于接收error的类型大多声明如下: [cpp] view plain copy print ? boost::system::error_code error 我们用这个类型去接受在函数中产生的错误, 如: [cpp] view plain copy print ? socket.connect(end
阅读更多...
boost asio异步服务器(3)增加发送队列实现全双工通信
增加发送节点 构造发送节点,管理发送数据。发送节点的类如下。 这个发送节点用于保证发送和接收数据的有效性。 增加发送队列 前边实现的是一个简单的echo服务器,也就是服务器将收到的内容发送给对应的客户端。但是在实际的服务器设计中,服务器是全双工工作的,也就是说,服务器会一直监听客户端的写事件,而在发送的过程中是可以在任意的时刻发送的。也就是说,实现全双工通信,需要对服务器的收发
阅读更多...