自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 libevent2.0 和 libevent2.1的区别

libevent2.0和libevent2.1的接口大体一致,只是做了少量的优化,下面就分析一下两个版本的主要区别,一是定时器增加了timerfd;二是io事件的处理增加了EV_CLOSE标记用于专门处理连接关闭。

2024-03-09 23:25:47 580

原创 libevent源码解析:定时器事件(三)

libevent中对三类事件进行了封装,io事件、信号事件、定时器事件,libevent源码分析系列文章会分别分析这三类事件,本文分析定时器事件。

2024-03-07 22:47:50 771

原创 libevent源码解析:信号事件(二)

libevent中对三类事件进行了封装,io事件、信号事件、定时器事件,libevent源码分析系列文章会分别分析这三类事件,本文分析信号事件。libevent框架将linux中的信号事件转换成io事件进行处理,从而将信号事件和io事件进行了有机的统一。

2024-03-07 22:35:00 1022

原创 libevent源码解析:io事件(一)

libevent中对三类事件进行了封装,io事件、信号事件、定时器事件,libevent源码分析系列文章会分别分析这三类事件,本文分析io事件。

2024-03-07 22:22:00 841

转载 【C++】多线程(thread)使用详解

多线程(multithreading),是指在软件或者硬件上实现多个线程并发执行的技术。具有多核CPU的支持的计算机能够真正在同一时间执行多个程序片段,进而提升程序的处理性能。在一个程序中,这些独立运行的程序片段被称为“线程”(Thread),利用其编程的概念就叫作“多线程处理”。

2023-10-26 19:51:14 212

原创 linux编程:网络编程(二)

多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是,不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监视文件。主要使用的方法有三种由内核监听客户端的行为,当客户端需要建立连接时,内核通知服务器直接建立连接,当客户端写入数据时,由内核通知服务器,服务器就直接读取数据。这就使得需要等待的io操作有内核完成,服务器直接进行业务处理而不需要阻塞等待。但如果链接客户端过多,select采用的是轮询模型,会大大降低服务器响应效率pselect原型如下。

2023-09-20 00:01:13 114

原创 linux编程:网络编程(一)

网络基础协议的概念什么是协议从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。假设,A、B双方欲传输文件。规定:第一次,传输文件名,接收方接收到文件名,应答OK给传输方;第二次,发送文件的尺寸,接收方接收到该数据再次应答一个OK;第三次,传输文件内容。同样,接收方接收数据完成后应答OK表示文件内容接收成功。由此,无论A、B之间传递何种文件,都是通过三次数据传输来

2023-09-19 23:37:01 172

原创 linux编程:守护进程

在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),进程中,控制终端是保存在PCB中的信息,而fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。进程组,也称之为作业。操作系统设计的进程组的概念,是为了简化对多个进程的管理。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。

2023-09-19 22:56:37 66

原创 linux编程:进程间通信

2. 如果有指向管道写端的文件描述符没关闭(管道写端引用计数大于0),而持有管道写端的进程也没有向管道中写数据,这时有进程从管道读端读数据,那么管道中剩余的数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回。4. 如果有指向管道读端的文件描述符没关闭(管道读端引用计数大于0),而持有管道读端的进程也没有从管道中读数据,这时有进程向管道写端写数据,那么在管道被写满时再次write会阻塞,直到管道中有空位置了才写入数据并返回。父进程可以向管道中写入数据,子进程将管道中的数据读出。

2023-09-19 22:40:36 36

原创 linux编程:进程

一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。ls命令也是一个程序,执行它不需要提供完整的路径名/bin/ls,然而通常我们执行当前目录下的程序a.out却需要提供完整的路径名./a.out,这是因为PATH环境变量的值里面包含了ls命令所在的目录/bin,却不包含a.out所在的目录。这样设计,无论子进程执行父进程的逻辑还是执行自己的逻辑都能节省内存开销。

2023-09-19 22:23:08 67

原创 linux编程:线程同步

当一个写线程加写锁后,其他所有试图获得锁的线程都会阻塞,当该线程释放写锁后,如果阻塞的线程有写线程,则会优先给他写锁,没有就会给读线程读锁,当读线程请求读锁时,能够成功读取,当有写线程请求写锁则会进入阻塞,后面请求读锁的线程也会进入阻塞,读锁释放后,会给写线程加锁执行写操作。如直接使用mutex,除了生产者、消费者之间要竞争互斥量以外,消费者之间也需要竞争互斥量,但如果汇聚(链表)中没有数据,消费者之间竞争互斥锁是无意义的。当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁,B阻塞。

2023-09-18 23:37:00 41

原创 linux编程:线程

在一个线程中调用pthread_create()创建新的线程后,当前线程从pthread_create()返回继续往下执行,而新的线程所执行的代码由我们传给pthread_create的函数指针start_routine决定。线程id的类型是thread_t,它只在当前进程中保证是唯一的,在不同的系统中thread_t这个类型有不同的实现,它可能是一个整数值,也可能是一个结构体,也可能是一个地址,所以不能简单地当成整数用printf打印,调用pthread_self(3)可以获得当前线程的id。

2023-09-18 22:55:13 50

原创 linux编程:信号

信号在我们的生活中随处可见, 如:古代战争中摔杯为号;现代战争中的信号弹;体育比赛中使用的信号枪…他们都有共性:1. 简单 2. 不能携带大量信息 3. 满足某个特设条件才发送。信号是信息的载体,Linux/UNIX 环境下,古老、经典的通信方式, 现下依然是主要的通信手段。Unix早期版本就提供了信号机制,但不可靠,信号可能丢失。Berkeley 和 AT&T都对信号模型做了更改,增加了可靠信号机制。但彼此不兼容。POSIX.1对可靠信号例程进行了标准化。

2023-09-17 23:25:00 85

原创 jsoncpp序列化源码详细分析

本文结合源码详细分析了jsoncpp的序列化过程。

2023-09-05 21:50:26 372

原创 vscode编译多文件复杂项目时tasks.json launch.json 的配置

本文介绍了利用vscode编译复杂工程的方法,包括gcc和cmke编译时 tasks.json launch.json c_cpp_properties.json 的具体配置。

2023-09-04 23:26:22 4432 1

原创 通过实验学习Iptables规则

本文对重要的表和链进行了实验验证,包括filter表中的INPUT/OUTPUT/FORWARD链,NAT表中的POSTROUTING/PREROUTING链。

2023-08-29 23:24:26 149

原创 vmware不能Ping通主机以及不能连接互联网的解决办法

分几种模式讨论了虚拟机和物理机不能通信,以及虚拟机不能连接互联网的几种情况。

2023-08-24 23:12:45 6334 3

原创 traceroute出现*的原因

traceroute用来查看一个数据包沿途经过的路由ip地址,但是有时候一行会出现*, 甚至某一行后面全是 * ,这篇文章从表面上分析一下原因。包括互联网主机出现*和NAT模式下出现*的原因分析

2023-08-13 23:08:30 7707 3

原创 traceroute和ping的工作原理

ping命令通常用于检测一台主机是否可达,对于大多数主机能ping通就代表可达,不能ping通就是不可达,但是有些主机设置了防火墙只允许特定协议的数据包通过,这时ping包就会被主机直接丢弃,而且不会进行回应。为了进一步知道数据包到哪了,就需要traceroute命令,他能返回数据包沿途经过的所有节点ip,这样就能具体知道数据包在哪丢失的了。常用ICMP的报文格式如下图:ICMP报文大致可以分为差错报文、请求与应答报文、控制报文。每一种报文都会通过type、和code做进一步的区分。

2023-08-13 17:42:31 195 1

原创 vmware虚拟机NAT模式、桥模式、主机模式原理与区别

vmware虚拟机NAT模式、桥模式、主机模式原理与区别

2023-08-10 21:52:38 1208 1

原创 利用密码机实现openssl异步引擎

openssl中的加解密运算非常消耗cpu,会导致nginx的ssl连接数跟不上,现阶段大多数利用intel QAT加密卡实现openssl的异步机制,让耗时的加解密运算在加密卡中执行。本文利用密码机通过网络实现异步。openssl异步机制利用协程,需要配合异步加密卡,或者通过网络连接密码机来进行实现,通过将耗时的加解密运算丢给密码机,能够大大提高ssl握手连接数。

2023-07-24 23:25:44 206

原创 gdb打印变量十六进制数据

gdb打印变量十六进制数据

2023-07-24 22:17:32 1873

原创 在网络传输数据的两种方式

在网络程序开发中经常会有将各种格式的应用数据通过网络传输给另一端,另一端需要解析出发送端发送的数据。一般有两种情况,一种是将发送端发送的各种格式的数据序列化成字符串,可以自定义序列化格式,或者用经常使用的json格式等;另一种是直接将二进制数据打包发送给对端,这里就要注意 大小端的转换。如将上面字符串转换成发送给对方,对端通过分隔符-取出个字段内容,然后将age weight转换成数字。将数据序列化成字符串适用于需要传递大量复杂数据的场合,如在http数据交互中经常用json进行序列化或则反序列化;

2023-07-23 22:51:03 218 1

原创 密钥、消息认证码、单向散列函数、数字签名的介绍和在openssl当中的使用

本文简单介绍了常见的网络攻击方式和一些防御手段,包括密钥、消息认证码、单向散列函数、数字签名。其中只涉及到一些基础知识,没有涉及一些复杂的数学运算,因为作为开发人员只需要了解原理,调用openssl之类封装的算法接口即可,而不需要进行发开具体的算法。1.加密和解密都是用的同一密钥。2.密码算法分为分组密码和流密码,常用的为分组密码。3.密钥是固定长度的比特序列,长度与不同的加密方法相关,如DES、三重DES为64比特密钥,AES为128比特密钥。

2023-04-08 16:55:54 675

原创 详解gmssl和tls1.2握手流程分析及接口实现

通过阅读openssl源码具体分析ssl握手中的报文交互流程,包括发送和处理每个报文所做的主要事情。同时分析ssl协议中的一些主要问题,包括tls和gmssl的区别、单向认证和双向认证、两种会话复用方式对比,调用openssl接口实现ssl客户端和服务端之间的通信。本篇文章梳理了tls1.2和gmssl的具体握手流程和算法实现,只进行了宏观层面的大致分析,openssl当中还有许多的细节需要在后续文章中继续分析。

2023-04-07 12:05:58 2728 3

原创 大小端存储与网络字节序和主机字节序

大小端存储和网络字节序、主机字节序之间的关联。

2023-04-03 21:50:06 329

原创 c/c++编译:使用CMAKE进行跨平台开发

本文给出了大多数用cmake进行构建项目的一个模板,能够在不同平台和不同的架构下进行编译,cmake相比于gcc和makefile能够更加高效的编译复杂项目。

2022-10-23 21:40:52 3130

原创 c/c++在windows下编译:使用MinGW gcc从零编译项目

c/c++在windows下编译:使用MinGW gcc从零编译项目

2022-08-20 14:20:50 2460

原创 c/c++在windows下编译:使用visual studio从0构建项目

梳理了一下构建visual studio项目的全过程,其中包括了大部分编译的常规操作。

2022-08-18 11:28:14 1525

原创 通过实验对比十大排序算法

通过实验对比十大排序算法

2022-08-08 23:30:23 371

原创 十大排序算法总结(c语言实现)(三)

桶排序,基数排序,计数排序

2022-08-08 22:16:18 332

原创 十大排序算法(c语言实现)(二)

归并排序、快速排序、堆排序对比分析与c语言实现

2022-08-07 23:53:47 197

原创 十大排序算法总结(c语言实现)(一)

冒泡排序、选择排序、插入排序、希尔排序的对比分析与c语言算法实现

2022-08-07 10:06:10 290

原创 从交换两数据值看指针的使用(c语言实现)

以交换两数据值为例来分析指针变量的使用,子函数通过指针变量来改变主函数中的变量值。

2022-07-30 15:48:56 873

原创 探究乱码问题的本源:GBK,UTF8,UTF16,UTF8BOM,ASN1之间的关联

探究乱码问题的本源:GBK,UTF8,UTF16,UTF8BOM,ASN1之间的关联

2022-07-24 21:35:15 2441

原创 c++传值和引用在递归当中的区别

c++传值和引用在递归当中的区别

2022-07-11 22:34:58 731

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除