c++并发编程(上)
1. 线程基础1.1 线程发起线程发起就是指启动一个线程,C++11标准统一了线程操作,可以在定义一个线程变量后,该变量启动线程执行回调逻辑。
12345678void thead_work1(std::string str) { std::cout << "str is " << str << std::endl;}int main(){ std::string hellostr = "hello world!"; //定义一个字符串 std::thread t1(thead_work1, hellostr); //通过()初始化并启动一个线程 t1.join(); //主线程等待子线程退出}
在上面程序中,如果没有t1.join();或用std::this_thread::sleep_for(std::chrono::seconds(1 ...
linux网络编程小项目-在线词典
1. 项目概述在线词典项目是在linux系统下结合c语言、网络编程和sqlite3数据库等技术来实现的一个在线的英译英单词解释,当客户端成功连接到服务器后,客户端登录账号后输入想查询的单词,服务器端会在词库(网上找的)中寻找这个单词的解释并发送给客户端,从而实现在线查询。服务端同时也会向数据库存储该用户的一个查询记录,方便管理的同时,也方便客户端查询。
2. 实现的功能
用户注册和登录验证,服务器端将用户信息和历史记录保存在数据库中。
客户端输入用户名和密码,服务器端在数据库中查找、匹配,返回查询结果
根据客户端输入的单词在字典文件中搜索,将查询结果返回
历史记录查询
3. 代码实现3.1 服务器主函数和一些基本信息:这部分定义了一个双方通信的信息结构体,其中type是R时,表示客户端发来了注册请求;是L时,客户端发来了登录请求;是Q时,客户端发来了查询请求;是H时,客户端发来了观看历史请求。主函数实现的就是打开后台数据库,创建进程,与客户端成功连接后,子进程完成与对端的通信任务,父进程则继续监听与客户端的连接。这样就实现了服务器的一个并发功能,即同时可以连接处理多个客户端。 ...
grpc在windows环境下的配置与编译
1. 简介gRPC(全称为gRPC Remote Procedure Call)是一种高性能、开源的远程过程调用(RPC)框架。由Google开发,gRPC基于HTTP/2协议,并使用Protocol Buffers(Protobufs)作为接口描述语言。以下是gRPC的一些关键特性和优势:
高性能:gRPC利用HTTP/2的特性,例如多路复用和二进制协议,提高了传输效率和性能。
多语言支持:gRPC支持多种编程语言,包括C++、Java、Python、Go、Ruby、C#等,使得开发人员可以在不同的编程环境中使用它。
简化开发:通过使用Protobufs,gRPC提供了一种简洁和高效的方式来定义服务接口和消息结构。
双向流:gRPC支持客户端和服务器之间的双向流通信,使得它在需要实时通信的应用场景中表现尤为出色。
负载均衡和命名解析:gRPC内置了负载均衡和命名解析功能,使其更易于在分布式系统中使用。
1.1 主要组成部分
服务定义:开发者使用Protobufs定义服务和消息。
客户端和服务器代码生成:gRPC使用Protobufs定义生成相应的客 ...
butterfly主题美化
1. 页面底部footer跳动的心1.1 步骤编辑C:\blog\themes\Butterfly\layout\includes\footer.pug文件
1.将以下内容:
1©${theme.footer.owner.since} - ${nowYear} By ${config.author}
改为:
1©${theme.footer.owner.since} - ${nowYear + ' '} <i id="heartbeat" class="fa fas fa-heartbeat"></i> ${config.author}
2.将以下内容:
1©${nowYear} By ${config.author}
改为:
1©${nowYear + & ...
boost库asio编程(下)
1. beast网络库搭建http服务器1.1 简介通过asio来实现http服务器也需要严格服从http报文头的格式,其实http报文头的格式就是为了避免我们之前提到的粘包现象,告诉服务器一个数据包的开始和结尾,并在包头里标识请求的类型如get或post等信息。一个标准的HTTP报文头通常由请求头和响应头两部分组成。
http请求头格式:
123456GET /index.html HTTP/1.1 //包含用于描述请求类型、要访问的资源以及所使用的HTTP版本的信息。Host: www.example.com //指定被请求资源的主机名或IP地址和端口号。Accept: text/html, application/xhtml+xml //指定客户端能够接收的媒体类型列表,用逗号分隔,例如 text/plain, text/html。User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0 //客户端使用的浏览器类型和版本 ...
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.典型的协议
应用层:常见的协议有HTTP协议、FTP协议
传输层(添加端口):常见协议有TCP/UDP协议
网络层(添加ip地址,选路):常见的协议有IP协议、ICMP协议、IGMP协议
网络接口层(添加mac地址(网卡)):常见的协议有ARP协议、RARP协议
物理层:负责通信
2.分层模型结构
OSI七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP四层模型:网络接口层(链路层)、网络层、传输层、应用层
3.网络传输流程
注意:数据没有封装之前,是不能在网络中传递的。
4.ARP协议
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址(mac地址),而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用,源主机发出ARP协议,询问IP地址是192.168.0.1 ...
系统编程
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 ...