《白话C++》第13章 网络 asio
文章平均质量分 65
《白话C++》第13章 网络 asio的学习笔记
yanzhenxi
这个作者很懒,什么都没留下…
展开
-
第13章 网络 Page818 UDP(和TCP的比较)
【代码】第13章 网络 Page818 UDP(和TCP的比较)原创 2024-02-18 09:37:08 · 917 阅读 · 0 评论 -
第13章 网络 Page749~755 asio核心类 ip::tcp::acceptor
之前my_resolver程序在解析处ip地址后,会以客户端的身份,向该地址以及用户输入的端口所代表的目标,尝试发起连接,若层工,就输出“成功。这个参数作为入参传递给async_accept()函数,此时还没有接受到任何连接请求,因此该变量。ip::tcp::resolver::async_resolve()的回调函数好歹传回了解析的结果resolver::iterator iterator,但 ip::tcp::async_accept() 的回调又只是传回是否出错的结果,代表网络连接的那个套接字变量。原创 2024-02-18 00:24:59 · 666 阅读 · 0 评论 -
第13章 网络 Page747~749 asio核心类 ip::tcp::resolver
条件是一个类型 ip::tcp::resolver::query,此处Query作名词解。到位地解析成ip::tcp::socket建立连接所需要的ip::tcp::endpoint结构,address类被直接跳过。例子最后一步的"*it",得到的是basic_resolver_entry 对象,但通过重载的转换符,resolver::resolve()方法返回的结果类型不是ip::tcp::endpoint,全称在代码中可以写成ip::tcp::resolver::iterator。原创 2024-02-17 23:45:01 · 718 阅读 · 0 评论 -
第13章 网络 Page744~746 asio核心类 ip::tcp::endPoint
libucurl 库采用字符串URL表达目标的地址,如:“http://www.sina.com.cn”。ip::tcp::socket用于连接TCP服务端的 async_connect()方法的第一个入参是。. 此处的类型 endpoint_type 是 ip::tcp::endpoint 在。address类全名是boost::asio::ip::address.然后就可以用ip::tcp::socket主动连接新浪的服务器。在 ip::tcp::socket 类内部的一个别名。原创 2024-02-17 23:00:03 · 755 阅读 · 0 评论 -
第13章 网络 Page741~744 asio核心类 ip::tcp::socket
比如图中示意一写一读,实际应用也有可能是“写,写,读,读”或“读,读,写,写”。如果操作发生错误,error传入出错信息,这一点和定时器的回到操作的入参一样,其实是asio中各类回调都必须有的入参。拥有async_connect异步连接,async_read_some异步读,和async_write_some异步写的方法,但asio版本的回调,两个入参,一个出错时才有用,另一个只是告诉我们数据的大小。网络数据的传输,无论是发是收,是块是慢,相比CPU的计算速度,总是可以认为数据是在“断断续续”地流动的。原创 2024-02-17 22:25:24 · 1189 阅读 · 0 评论 -
第13章 网络 Page738~741 13.8.3 TCP/UDP简述
libcurl是C语言写成的网络编程工具库,asio是C++写的网络编程的基础类型库libcurl只用于客户端,asio既可以写客户端,也可以写服务端libcurl实现了HTTP\FTP等应用层协议,但asio却只实现了传输层TCP/UDP等协议。在学习http时介绍过“OSI网络七层”协议,但实际应用更多的是“TCP/IP五层协议”,在后者的分层中,HTTP和FTP均为在TCP均为在TCP之上实现的协议,如下图13-19所示。原创 2024-02-17 20:29:02 · 1235 阅读 · 0 评论 -
第13章 网络 Page737~738 “I/O对象”的链式传递 计数器继承enable_shared_from_this<DownCounter>,使用function类型
asio默认使用boost版本的绑定工具。怎么个默认法呢?比如当绑定需要使用入参占位符时,在boost::asio::placeholders之下定义的占位符变量的类型,全是boost库内定义的类型(建议查阅“boost\asio\placeholder.hpp”文件)。如果出现混用,比如使用std::bind()方法,但方法中用到的入参占位符却使用boost定义的版本,会出现一堆编译问题。下面放弃lambda,改用function对象作为timer.async_wait()入参的完整代码。原创 2024-02-15 23:57:45 · 370 阅读 · 0 评论 -
第13章 网络 Page735~736 “I/O对象”的链式传递 计数器继承enable_shared_from_this<DownCounter>
使用enable_shared_from_this基类和该基类带来的shared_from_this()方法。DownCounter被加上基类enable_shared_from_this原创 2024-02-15 23:07:07 · 369 阅读 · 0 评论 -
第13章 网络 Page734 “I/O对象”的链式传递 单独的火箭发射函数,没有用对的智能指针
上一篇博文中,我们使用单独的火箭发射函数,结果什么结果也没有得到,原因是launch_rocket()函数结束时,其内的局部对象counter生命周期也结束了那么可以将counter改为指针吗?在堆中分配,这样当函数退出时,它不会被释放。这样肯定是不行的,这样不会得到结果,还会造成内存泄露。那么我们可以使用智能指针,如下图。原创 2024-02-15 22:25:35 · 372 阅读 · 0 评论 -
第13章 网络 Page733 “I/O对象”的链式传递 单独的火箭发射函数
之所以没有将io_service对象也挪到launch_rocket()函数中,是因为正常的asio程序肯定还会有大量的其他异步操作需要这个io_service对象。原创 2024-02-15 20:40:47 · 364 阅读 · 0 评论 -
第13章 网络 Page729~733 链式任务反应
思路:和Peng结构一样,由于存在状态传递以及会重复调用,所以考虑使用“函数对象”作为定时的回调动作(否则就可能要用到全局数据或者使用binder以绑定状态数据了)。当io_service对象身上没有任务的时候,当前正在运行的run()过程就结束了。这时再往它身上添加任务,程序收不到任务完成事件。如果本次任务完成后,run()函数退出前再添加一项或更多任务,这就叫链式任务。在asio的异步世界里,链式任务是最常用的任务产生模式。最关键的代码是括号操作符重载函数24~39行。原创 2024-02-15 01:48:22 · 391 阅读 · 0 评论 -
第13章 网络 Page727~728 asio定时器例子:后创建的定时器先产生到点事件
36行,43行,52行,分别将任务完成后的回调动作设置为函数对象。35行,42行,51行,分别构造三个对象,原创 2024-02-14 23:35:37 · 353 阅读 · 0 评论 -
第13章 网络 Page724 asio定时器
23~33行,使用定时器的async_wait()方法,为定时器设置一个回调活动(函数指针,函数对象,Lambda表达式,std::function对象都可以),当定时器的定时任务完成以后,则调用回调活动。37行,启动io_service服务,定时器定时任务完成后,便会启动定时器的回调活动(async_wait()函数的参数)。若被注释掉,则定时任务完成后,不会启动回调活动。16行,为定时器设置一个定时任务,定时工作由操作系统完成。13行,使用ios对象作为参数声明一个定时器。11行,声明一个ios对象。原创 2024-02-14 16:32:04 · 874 阅读 · 0 评论 -
第13章 《网络》13.8.1异步、异步、异步 Page720~721
【代码】13.8.1异步、异步、异步 Page720~721。原创 2024-01-23 02:20:13 · 368 阅读 · 0 评论