自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2021-09-02

重要通知弟兄们,CSDN博客此后不再持续更新,请大家访问我的个人博客,地址是 ahaoaha.github.io

2021-09-02 10:50:03 170

原创 TCP协议

16位源端口号:存储源进程所使用的端口号。16位目的端口号:存储目的进程所使用的端口号。32位序号:当前报文的序号。32位确认序号:对上一条报文的确认序号。4位首部长度:表示该TCP报文有多少个4字节。所以TCP单条报文的最大长度为 15*4 = 60字节6位标志位:SYN:请求建立连接,将携带SYN标识称为同步报文段RST:对方请求重新建立连接,将携带RST标识称为复位报文段FIN:通知对方,当前端即将关闭,将携带FIN标识的称为结束报文段URG:标识紧急指针是否有效AC..

2020-12-23 13:27:20 349

原创 二叉树操作

前/中/后序遍历递归版本//前序遍历void PreOrder(Node* root) { if(root == nullptr) { return; } //TODO 遍历当前节点 PreOrder(root->left); PreOrder(root->right);}//中序遍历void MiddleOrder(Node* root) { if(root == nullptr) { return;

2020-12-23 13:24:12 201

原创 vim和gdb的使用

vim光标光标跳转至函数/define/变量定义处[ + [Ctrl] + i返回光标之前的位置[Ctrl] + o返回光标之后的位置[Ctrl] + i全文对齐gg + = G跳转到对应的括号处%光标移动至行首^或0光标移动至行尾$查找光标所在处的单词normal模式下×删除删除光标前n个字符n + X删除光标后n个字符n + xgdb断点在对应行号打断点b + [行号]或break + [行号]在对应函数入口处设置断点b + [函数名]按条件设置断点b + [

2020-12-23 13:23:13 359

原创 UDP协议

16位源端口号:存储源进程所使用的端口号。16位目的端口号:存储目的进程使用的端口号。16位UDP长度:标记处UDP协议的长度,表示整个UDP数据报的长度(UDP头部+UDP数据)。因为UDP头部的长度为8字节,16位UDP长度的最小值为8,最大值即为2^16-1 = 65535,所以UDP协议可以传送的最大的数据报大小为65535。16位UDP校验和:进行数据的确认,如果在接收端校验和不正确,则直接抛弃该报文。校验和该如何计算?UDP的发送过程应用层交给UDP多长的数据,UD..

2020-12-23 13:22:20 272

原创 thunderbird设置outlook格式回复头

插件:ChangeQuote自定义回复头:<br><div style="border:none; border-top:solid #B5C4DF 1.0pt; padding:3.0pt 0cm 0cm 0cm"><div style="padding-right: 8px; padding-left: 8px; font-size: 16px; font-family: tahoma; color: #000000; background: #efefef; padd

2020-12-23 13:21:34 246

原创 TCP连接机制

阐述TCP建立连接时为什么要进行三次握手,断开连接时为什么又要进行四次挥手。连接的维护客户端与服务器连接成功之后,客户端和服务器为了维护该段链接都是要使用自身资源的,服务器在这里是面向众多的客户端的,维护一段连接对客户端来讲所需要的资源是不值一提的,但是作为一台服务器,当来自世界各地的客户端来连接它的时候,这时候对服务器来讲,维护这些众多连接所需要的资源就是十分珍贵的。确认应答机制TCP的连接是可靠的,如何来保证连接的可靠性?在日常生活中,发送一条信息,当对方对所发出的信息进行回复时就可以确认对方

2020-12-23 13:20:54 439

原创 Shell语法总结

#!告诉系统其后面的路径指定的程序就是此脚本文件的shell程序。注释单行注释:#多行注释:#!/bin/bash:<<EOF注释内容 ...EOF变量定义普通变量变量名=变量值变量名和等号之间不能有空格命名只能使用英文字母、数字、下划线,首字符不能以数字开头变量名不能与bash关键字同名for循环语法定义变量#!/bin/bashfor file in `ls /etc`doecho $filedone# 打印/etc下的所有文件定

2020-12-23 13:20:06 251

原创 Nginx Notes

反向代理服务器通常一个大型项目会部署在一组或者多组的后端服务器上,反向代理即就是做这些后端服务器的代理人,只把代理人的IP/域名暴露给客户端,当客户端请求到达时,代理人根据客户端的请求,从其后端的服务器上获取资源,再返回给客户端,从客户端角度来看,只能感知到代理人的存在,而不会感知到后台服务器的存在。Nginx的特点反向代理加速(无缓存)简单的负载均衡和容错基于IP和名称的虚拟主机服务支持keep-alive和管道连接支持热重启…Nginx内置负载均衡相关策略基于轮询的均衡策略

2020-12-23 13:19:09 87

原创 Golang协程调度

协程调度P// P的状态const ( // P status _Pidle = iota _Prunning // P的状态只能从_Prunning改变 _Psyscall _Pgcstop _Pdead)程序中的P会在程序启动的时候初始化完成并链接在sched全局调度器的pidle队列中。G// 协程状态const ( // G status _Gidle = iota // 空闲的G _Grunnable // 可以被调度的G _Grunning // 正在

2020-12-23 13:18:14 143

原创 Linux工具

开一篇博客记录一下平时在linux环境使用到的工具,防止时间太久不使用之后被忘记。简单命令符号 ``[location ~]$ ssh `cat [ip文件名]`$()[location ~]$ ssh $(cat [ip文件名])这样就可以完成一键完成通过文件中保存的ip连接目标机器了curl通过curl可以在Linux环境获取HTTP请求的内容,作用十分相当于windows下的fiddler。tailtail可以对文件进行读取,默认读取文件的最后10行,通常可以用来

2020-12-22 12:28:13 94

原创 Linux下的进程信号

信号的产生信号的产生方式键盘产生键盘产生的信号只能发送给前台进程。例如:[Ctrl+C]…程序异常除0错误。除0错误会导致硬件错误。core dumped(核心转储):当进程异常退出时,操作系统会将该进程发生异常退出之前在内存中的数据存储至硬盘上。但是通常发生程序异常退出时,用户并不会发现程序产生了一个core dumped文件,这是因为操作系统当前给用户可产生core file size大小为0,因为core文件的大小不是很小的,所以一般系统会将可产生core文件的大小为0,

2020-12-22 12:27:33 112

原创 IP协议

title: IP协议date: 2019-03-19 23:08:32categories: 协议tags: Linux4位版本:指定IP协议的版本(IPV4/IPV6),对于IPV4来说,就是44位首部长度:描述IP头部的长度是多少个32bit(4字节),因为4位能够表示的最大的数是15,则IP头部的最大长度即为60字节8位服务类型:8位分别为3位优先权字段(已经弃用),4位TOS字段,1位保留字段(必须置为0),4位TOS分别表示:最小延时、最大吞吐量、最高可靠性、最小.

2020-12-22 12:24:03 235

原创 I/O多路转接

高级I/O在Linux中,我们可以将所有的I/O都分为两步,第一步就是等,第二步是数据拷贝。在学习编程的初级阶段,就可以发现I/O是一种十分浪费资源的行为,而这种资源的浪费主要是存在I/O的第一个阶段,即就是等待阶段。对于I/O的理解,主要可以通过scanf函数,如果调用scanf函数,则执行流就会等待用户进行I/O操作,之后执行流才会执行下面的内容,但是scanf这种I/O模型只是Linux中I/O模型的一种。阻塞式I/O阻塞式I/O就是执行流会阻塞在要发生I/O的位置,等待I/O时间的发生

2020-12-22 12:22:45 169

原创 Golang中操作字符串

golang中使用strings包完成对字符串的主要操作。判断前缀/后缀strings.HasPrefix(s, prefix string) bool //判断字符串s是否以字符串prefix作为开头,返回值为boolstrings.HasSuffix(s, suffix string) bool //判断字符串s是否以字符串suffix作为结尾,返回值为bool//模拟实现package MyStrings//判断s字符串是否以prefix作为开头func MyHasPrefix(s

2020-12-22 12:21:52 438 1

原创 Golang协程调度

协程调度P// P的状态const ( // P status _Pidle = iota _Prunning // P的状态只能从_Prunning改变 _Psyscall _Pgcstop _Pdead)程序中的P会在程序启动的时候初始化完成并链接在sched全局调度器的pidle队列中。G// 协程状态const ( // G status _Gidle = iota // 空闲的G _Grunnable // 可以被调度的G _Grunning // 正在

2020-12-22 12:21:11 309

原创 Golang jsonTag

json Tagtype Student struct { Name string `json:"name"` Age int32 `json:"age"` Class string `json:"class"`}Tag就是跟在结构体成员之后单引号中的内容,它的作用是用来当结构体对象进行编解码时,提供编/解码的方案。举例说明:package mainimport ( "fmt" "encoding/json")

2020-12-22 12:20:08 416

原创 C++风格的四种类型转换方式

static_cast仅可以用于基本类型间的数据之间的相互转换。//eg:int main(){ int a = 5; long long int b = static_cast<long long int>(a); return 0;}const_cast不能用于不同类型之间的类型转换,仅仅用来为对象删除const/volatile属性,const_cast种的类型必须是指针/引用。int main(){ const int a = 3;

2020-12-22 12:18:39 209

原创 C++11的新特性

更加简单的初始化方式C++11提供在类中定义类的数据成员,可以直接在成员之后添加=[缺省值],当通过编译器自动生成的默认构造函数初始化对象时,对应的数据成员就会被初始化成对应的缺省值。class Test{ public: int _t = 100;};int main(){ Test t; //初始化完成后,t._t的值为100 return 0;}更加强大的{}在C++98中,数组可以使用{}来进行初始化,对自定义类型是不可以的。在C++11中,{}的使

2020-12-22 12:17:53 121

原创 cmake常用命令

内建函数cmake_minimum_required(VERSION xxx):指明所需要的最低cmake版本为xxxproject([PROJECT_NAME] [CXX][C][Java]):该函数用来定义工程名称,并指定工程支持的语言,支持的语言选项是可以忽略的,默认支持所有语言。set([VALUE_NAME] [VALIUE]):该函数用来显式的定义变量,[VALUE]是一个可变参数列表。message(SEND_ERROR|STATUS|FAUAL_ERROR "echo messag

2020-12-22 12:15:40 272

原创 以太网数据帧和ARP协议

原文链接:https://www.ahaoaha.top/2019/07/01/以太网数据帧和ARP协议/以太网数据帧在以太网环境下,数据链路层的数据帧格式为:在以太网环境下,需要得知目的主机的mac地址才可以进行数据帧的发送,但是在数据帧从上层向下封装时,并无法得知目的主机的mac地址,所以在数据链路层进行数据帧格式的封装时,需要用到ARP协议。前导码和帧开始符:以太网上的每一个数...

2019-07-02 13:12:14 2073 1

原创 GolandIDE的一些常用快捷键

原文链接:https://www.ahaoaha.top/2019/05/31/GolandIDE的一些常用快捷键/查找文件/代码shift + shift全局搜索,ctrl + N相同功能,在使用过程中经常会在切换中英文的时候唤醒全局搜索窗口,所以双击shift操作我是不太喜欢的。ctrl + shift + N全局搜索文件ctrl + shift + alt + N搜索函数或变量,全...

2019-07-02 13:09:27 3720 1

原创 Golang-defer的使用

原文链接:https://www.ahaoaha.top/2019/05/24/Golang-defer的使用/在golang中defer关键字用来在函数return或者panic之前完成一些动作,经常用来释放资源等,defer的执行时机如下:保存返回值执行defer动作执行空returndefer执行的顺序如果一个函数中有多个defer动作,那么这些defer动作的执行顺序类似于...

2019-07-02 13:08:25 270

原创 Golang基础语法总结

原文链接:https://www.ahaoaha.top/2019/04/28/Golang基础语法总结/本文基于golang1.12.5。前提知识golang以包(文件夹)作为管理单位每一个xxx.go文件必须先声明所属包一个程序中必须有一个main包导入的包必须进行使用,否则会编译报错,在VsCode编辑器下,保存xxx.go文件时,未使用的包会自动进行删除golang中的in...

2019-07-02 13:07:05 1941

原创 Golang中的常用数据结构

原文链接:https://www.ahaoaha.top/2019/05/17/Golang中的常用数据结构/stringgolang中string是一个内置类型,它的默认值是"",golang中的string的底层结构与C++的STL中的string是很类似的,golang中string是定长的,在底层结构的len中记录当前string的长度,它不支持扩容,但是golang依旧支持strin...

2019-07-02 13:05:12 1237

原创 Golang中的定时任务

原文链接:https://www.ahaoaha.top/2019/05/28/Golang中的定时任务/Timer设置定时器,经过duration时间,Timer会被触发,Timer被触发之后,调用Reset函数,重新设置定时器,再经过duration的时间,Timer会被再次触发。使用方式通过AfterFunc返回Timer对象,AfterFunc被调用之后,再计时结束之后,对应的函...

2019-07-02 13:03:41 1468

原创 Golang中协程的使用

原文链接:https://www.ahaoaha.top/2019/05/09/Golang中协程的使用/本文相关demo,请点击此处协程与函数返回值golang中的协程是由Go routime进行管理的,如果函数有返回值,则这个函数的返回值会被丢弃。Golang协程的创建使用go FUNC_NAME(PARAMETER_LIIST)可以很简单的创建出一个协程来执行相应的操作Gola...

2019-07-02 13:01:55 1659

原创 Toml配置文件的使用

原文链接:https://www.ahaoaha.top/2019/05/29/Toml配置文件的使用/toml的使用下载第三方库:go get github.com/BurntSushi/tomltoml的配置格式十分灵活,可以是整数(最小尺寸64位)、字符串(必须是utf-8编码)、数组、布尔值简单类型;也可以数组、map等复杂类型。语法表格表格是键值对的集合,使用[]定义,一个表...

2019-07-02 12:59:19 5725

原创 常见的排序算法

阅读原文请点击此处本文代码托管于Github,阅读源码请点击此处交换排序冒泡排序冒泡排序是我接触最早的排序方法,第一次接触冒泡排序是在大一上C语言课的时候,冒泡排序是最简单的一种排序算法。//代码解析冒泡排序--> 小-->大void BubbleSort(std::vector<int>& v){ for(size_t i = 0; i &...

2019-07-02 12:57:14 122

原创 浮点数在内存中的存储

点击此处阅读原文浮点数在内存中的存储方式与整型数字是不同的,对浮点数的存储实际上是对IEEE754中规定的S、M、E的存储。浮点数:float、double、long double根据国际标准IEEE754,任意一个二进制浮点数可以被表示成下面的形式:(-1)S*M*2E(-1)^S表示符号位,当S=0,则表示正数;当S=1,则表示负数M表示有效数字,大于1,小于2(大于1小于进制)...

2019-05-21 21:53:08 121

原创 关于栈空间的大小

点击此处阅读原文在进程的虚拟地址空间中,栈空间用来为函数开辟栈帧以及存放局部变量,栈空间相对于堆空间是较小的,但是这也不是绝对的,因为栈空间的大小是可以被改变的。Linux查看栈空间大小在Linux环境下,可以通过ulimit -a来查看栈空间的大小:stack size字段即代表栈空间的大小,可以看出Linux环境下默认的栈空间大小为8M。改变栈空间大小使用ulimit -s [...

2019-05-21 21:51:51 8098

原创 进程间的状态切换

点击此处阅读原文进程之间的状态切换。下文中以单核计算机为例。在任意时刻下,通常只有一个进程可以被加载到计算机的CPU上运行。三状态模型任何一个进程在它的生命周期内都会处于下面三种状态,使用这三种状态可以简单描述运行在计算机上的进程之间的状态切换,进程的一生都处在这三种状态间相互转换。运行态(Running):指该进程正在被CPU调度运行。就绪态(Ready):指该进程满足被CPU调度...

2019-05-21 21:31:27 4488

原创 进程间通信

点击此处阅读原文进程间通信的本质就是让不同的进程额能够看到同一份公共的资源。进程间通信的方式管道管道是Linux操作系统下的一种文件类型,该文件类型的文件就是为了给不同进程之间提供可以进行通信的文件资源。一个管道只能单向通信。为什么一个管道只能进行单向通信?一个进程可以对一个管道文件进行读或写操作,当两个进程通过一个管道进行通信时,一定是有一个进程对管道进行写操作,另一个管道进行...

2019-05-21 21:30:14 236

原创 网络基础知识

点击此处跳转原文地址在局域网上两台主机的两个进程进行通信。网络分层模型OSI七层模型OSI(Open System Interconnection)七层模型称为开放式互联网的参考模型,是一个逻辑上的定义和规范,并不是实际中的网络一定是按OSI七层模型来设计的。TCP/IP五层(或四层)模型应用层:负责程序之间的沟通,网络编程主要针对应用层。传输层:负责两台主机之间的数据传输。...

2019-05-21 21:27:43 215

原创 智能指针

点击此处跳转至原文地址智能指针出现的必要?在C++中,用户需要自己管理申请的内存,有时候会忘记释放所申请的内存;有时候因为程序执行流的改变导致申请的空间没有进行释放,就会造成内存泄露的问题。RAIIRAII是一种实现智能指针的思想,也就是将所申请的内存空间交给一个对象来管理,当对象的生命周期到达时,程序会自行调用对象的析构函数。智能指针智能指针的两个条件:RAII像指针...

2019-05-21 21:26:26 110

原创 C++模板

模板的基本概念与用法。模板函数模板函数即就是与类型无关的函数,当需要某种类型的该函数时,编译器就会自动生成这种类型的函数,编写者只需要定义好该函数的处理逻辑即可。模板函数的格式template&lt;typename T1, typename T2, ..., typename Tn&gt;[返回值] [函数名](...){ ...}//交换函数template&lt...

2018-12-30 14:12:01 118

原创 网络基础知识

网络分层模型OSI七层模型OSI(Open System Interconnection)七层模型称为开放式互联网的参考模型,是一个逻辑上的定义和规范,并不是实际中的网络一定是按OSI七层模型来设计的。TCP/IP五层(或四层)模型应用层:负责程序之间的沟通,网络编程主要针对应用层。传输层:负责两台主机之间的数据传输。网络层:负责地址管理和路由选择,例如在IP协议中,通过IP...

2018-12-29 15:50:23 216

原创 scanf缓冲区刷新问题

最近在Linux终端写代码时,使用scanf输入一个字符,当不小心输入了一个退格键或者方向键时,程序就出现无限读取的现象,这显然是scanf的缓冲区内的字符无法刷新出去,即研究一下scanf缓冲区的刷新规则。scanf缓冲区的刷新规则当scanf从缓冲区读取走需要的数据之后,缓冲区应该会被清空,但在某些情况下,缓冲区并不会会清空,使用下面的代码检测一下什么情况下缓冲区不会被清空:输入数字...

2018-12-26 16:54:50 877

原创 浮点数在内存中的存储

浮点数在内存中的存储方式与整型数字是不同的,对浮点数的存储实际上是对IEEE754中规定的S、M、E的存储。浮点数:float、double、long double根据国际标准IEEE754,任意一个二进制浮点数可以被表示成下面的形式:(-1)S*M*@E(-1)^S表示符号位,当S=0,则表示正数;当S=1,则表示负数M表示有效数字,大于1,小于2(大于1小于进制)2^E表示位数...

2018-12-09 23:08:33 247

原创 结构体内存对齐

一直以来对结构体内存对齐的知识都是十分模糊的,直至今日下定决心搞清楚它。结构体为什么要有结构体内存对齐?平台原因不是所有的硬件都能随意的访问任意地址处的任意数据, 有的CPU只能从内存上地址为4的倍数的地址处读取数据,而为了可以读取结构体数据,结构体的起始位置的地址理所应当的为4的倍数,而在结构体内部维护内存对齐是为了迎合硬件的这一特性。性能原因因为为了CPU能够快速访问,提高访问效...

2018-12-05 14:58:58 105

空空如也

空空如也

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

TA关注的人

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