boost库asio编程(中)
1. asio的通信流程首先是在应用层调用async_read()函数,就相当于是往io_context里面注册读事件,并且注册读回调函数。然后io_context会把对应的读事件、socket和回调都写到epoll模型或iocp模型里,即注册给这两个模型。而在应用层调用io_context.run的时候,实际上是一个死循环,它会调用linux的epoll模型或windows的iocp模型,以死循环的方式不断的轮询,不断的去检测我们注册的那些socket那些就绪了
如果有socket就绪了,比如说我们注册了一个socket监听对端的一个发送事件,对端发送过来了,我们这个读事件就会就绪了。读事件就绪的话,就会把读事件对应的回调函数写到就绪的队列里。如果是单线程的话,这些事件的回调函数放到就绪的队列里,系统直接就会把就绪队列里的回调函数一个一个取出来,按顺序来给我们回调,顺序就是我们在底层去轮询,发现哪个socket回调函数先就绪了,就先放到就绪队列里。如果是写的事件,它也会被放到该就绪队列里,最后由asio统一派发。
2. 字节序处理2.1 字节序的问题在计算机网络中,由于不同的计算机 ...
boost库asio编程(上)
1. boost库1.1 概述网络编程是现代软件开发中无可替代的一环,无论是构建庞大的分布式系统还是小型的桌面应用,都离不开网络的支持。Boost.Asio起源于Boost库,是一款专为网络I/O、定时器、串行端口通信设计的库,提供了同步和异步的编程模型,用以简化网络和低级I/O的操作。它的设计初衷是提供一套简洁、一致且功能全面的接口,以满足开发者在多样化网络编程场景下的需求。
1.2 库的特性与优势 Boost.Asio是一款功能全面的库,其主要特性与优势如下:
异步编程模型:它通过异步操作和回调机制,允许程序在等待I/O操作完成时继续执行其他任务,从而提高了程序的效率和响应速度
多协议支持: 它支持TCP、UDP、SSL等多种协议,可以帮助开发者快速实现各种网络应用
跨平台兼容性: Boost.Asio可以运行在Windows、Linux、macOS等多个平台上,保证了代码的可移植性和可维护性
可扩展性: 开发者可以基于Boost.Asio轻松实现自定义协议和服务,实现特定的业务逻辑
高性能: Boost.Asio的设计充分考虑了性能因素,尤 ...
高并发网络编程libevent
1. libevent库介绍1.1 什么是libeventlibevent也称为事件通知库,即所见皆事件,是一个用C语言实现的、基于事件驱动(event-driven)的轻量级高性能开源网络库,适用于Windows、Linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。libevent不一定是用到网络当中,本地的文件描述符都可以用。
1.2 libevent特点
事件驱动(event-driven),高性能
轻量级,专注于网络,不如 NGINX 那么臃肿庞大
源代码相当精炼、易读
跨平台,支持 Windows、Linux、*BSD和Mac OS,但Windows支持不怎么好
支持多种I/O多路复用技术,select、epoll、poll、dev/poll、select、kqueue、evports等
支持I/O,定时器和信号等事件
采用Reactor设计模式
支持HTTP(S),DNS解析
libevent是用于编写高速可移植非阻塞IO应用的库,其设计目标是:可移植性、高性能、便携和可扩展性
...
网络编程
1. 基本知识从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。
1.1 协议1.典型的协议
传输层:常见协议有TCP/UDP协议
应用层:常见的协议有HTTP协议、FTP协议
网络层:常见的协议有IP协议、ICMP协议、IGMP协议
网络接口层:常见的协议有ARP协议、RARP协议
2.分层模型结构
OSI七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP四层模型:网络接口层(链路层)、网路层、传输层、应用层
3.网络传输流程
注意:数据没有封装之前,是不能在网络中传递的。
4.ARP协议
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用,源主机发出ARP协议,询问IP地址是192.168.0.1的主机的硬件地址是多少,并将这个请求广播到本地网段,目的主机接收到广播ARP请求,发现其中的I ...
系统编程
1.基础入门1.1基本函数open()函数:打开一个文件
int open(char *pathname , int flags , mode_t mode)
参数:
pathname:想要打开的文件路径名
flags(头文件#include ):文件打开方式:O_CREAT|OAPPEND|…
mode:权限,当第二个参数设置了O_CREAT,就需要写该参数
mode:设置文件的权限(参数3使用前提:参数2指定了O_CREAT)
返回值:
成功:打开文件所得到对应的文件描述符(整数)
失败:-1,设置errno
read()函数:往一个文件读内容
ssize_t read(int fd , void *buf , size_t count)
参数:
fd:文件描述符
buf:存数据的缓冲区
count设置读字节数大小
count:缓冲区大小
返回值:
成功:读到的字节数
失败:-1,设置errno
write()函数
ssize_t write(int fd , const void *buf , size_t count ...
静态库与动态库
1. 函数库1.本质:一组函数,具有相近的功能或操作同一数据结构
<string.h>:strcpy/strcmp/strcat/strlen/strstr/strchr/strtkk…..
自定义库:<mysort.h>:bubble_sort/select_sort/quick_sort/insert_sort…..
2.作用:
代码复用
出现积累
3.发布形式:
源码形式
优点:方便使用者学习和使用
缺点:保密性差、编译程序耗时、编译受平台、版本限制
二进制形式:
优点、缺点与上面相反
4.我们使用的函数:标准c库:/lib/x86_64-linux-gnu/libc.so.6`
2.静态库
在linux中静态库由程序ar生成,现在静态库已经不像之前那么普遍了,这主要是由于程序都在使用动态库。关于静态库的命名如下:
机制:在编译程序时,复制静态库的代码片,到可执行程序中
优点:将函数库中的函数本地化,寻 ...
shell脚本编程
1. Shell脚本入门1.1 脚本格式要求
脚本以#!/bin/bash开头
脚本需要有执行权限
1.2 shell脚本的执行方式
输入脚本的绝对路径或相对路径
需要对脚本+x权限,再执行脚本
sh + 脚本
不需要对脚本+x权限,直接执行即可
案例:创建一个shell脚本,输出hello,world:
1234567891011121314mkdir /root/shcode #创建一个写shell脚本的文件夹vim hello.sh #在shcode目录下以vim文本编辑器编辑脚本#输入内容如下:#!/bin/bashecho “hello,world” #保存退出 #第一种方式执行(终端输入)chmod u+x hello.sh #让该用户对文件有执行的权限./hello.sh #1相对路径执行/root/shcode/hello.sh #2绝对路径执行#第二种方式执行 ...
makefile与gdb调试
使用 GCC 的命令行进行程序编译在单个文件下是比较方便的,当工程中的文件逐渐增多,甚至变得十分庞大的时候,使用 GCC 命令编译就会变得力不从心。这种情况下我们需要借助项目构造工具 make 帮助我们完成这个艰巨的任务。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Visual C++的nmake,QtCreator的qmake等。
makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
makefile文件有两种命名方式 makefile 和 Makefile,构建项目的时候在哪个目录下执行构建命令 make这个目录下的 makefile 文件就会被加载,因此在一个项目中可以有多个 makefile 文件,分别位于不同的项目目录中
1. gcc工作流程
GCC编译器对程序的编译下图所示,分为4个阶段:预处理(预编译)、编译、汇编、链接。GCC的编译器可以将这4个步骤合并成一个。
预处理:使用的是预处理器
在这个阶段主要做了三件事:展开头 ...
图床实现(通过百度智能云、七牛云、PicGo软件完成)
1.给域名添加新的解析进入百度智能云官网:https://cloud.baidu.com/,点击右上角的控制台
找到域名服务,点击域名管理,这里有你之前买的域名(没有买的最好买一个,很便宜),下面要为域名添加一共新的解析
在添加解析记录的界面中,主机记录可以随便填,例如填image,记录类型选择CNAME记录,记录值先随便乱填(后期会改),填写完上面内容后,点击确定,完成添加解析。
2.创建存储图片的空间进入七牛云官网:https://marketing.qiniu.com/,点击右上角的控制台
点击左上角的菜单,选择对象存储
进入后,选择空间管理,然后新建空间,存储空间的名称可以随便填,存储区域建议选择亚太-新加坡,访问控制选择公开,最好点击确定,完成空间建立
建立完成后,点击创建的空间名称,进入图床控制面板,选择域名管理,绑定域名
进入后,在添加域名的界面,其中加速域名是之前添加解析记录时填写的主机记录,而且后缀要加上你的域名(我因为之前填写过改域名,所以会提示创建过)。使用场景选择图片小文件,然后下面点击使用推荐配置,点击创建即可
绑定完成后,复制图上箭头所指的内 ...
Linux基础知识
1. Linux操作系统基础知识1.1 命令解析器shell就是命令解析器,它的作用是对用户输入到终端的命令进行解析,调用对应的执行程序。
用户在终端输入命令,由shell命令解析器对命令进行解析(按照$PATH 环境变量搜索命令),解析成内核能够识别的指令,最后由内核执行命令,最后由内核执行命令,终端显示命令执行的结果给用户。
注意:shell在寻找命令的时候是按照$PATH 环境变量去寻找的,如果找到了就执行对应的命令,若找不到就报错,执行echo $PATH 环境变量的值
最外层是用户层,如Qt中的一些按钮、屏幕等,而Qt是一个框架,可以理解为是应用层,里面封装的一系列函数供用户使用,可以使用Qt中的API直接跳过shell层,将其交给内核。如果通过命令来操作的话,应用层就相当于是终端
1.2 linux下主要目录
/bin:binary的缩写,用来存放二进制的可执行文件,如date、ls、rm、mv、cp等常shell用命令
/boot:存放的是linux系统启动需要的一些文件
/dev:用来存放硬件设备所对应的文件,如鼠标、键盘、硬盘、 ...