- 博客(27)
- 收藏
- 关注
原创 子网掩码笔记
引言 子网掩码时有一台主机或路由器使用的分配位,以确定如何从一台主机对应的IP地址中获取网络和子网信息,IP子网掩码的长度和IPv4的地址长度相同都是32位。在了解子网掩码之前首先需要知道IP地址的分类。IP地址分类 IP地址 = 网络地址 + 主机地址;那么网络地址所占的长度和主机地址所占的长度需要通过查看地址在IP地址的哪个分类中。类别及网络地址长度地址范围A 80.0.0.0~127.255.255.255B 16128.0.0.0~191.255.25
2022-01-21 10:12:32
745
原创 UDP协议
引言 本文中只关于IPv4;UDP是一种保留消息边界的简单的面向数据报的传输层协议。它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制。总之,能没有的都没了。但它提供了差错检测,是一种端到端的校验和。因此使用它的程序必须自己实现正确的排序等UDP没有的功能。 UDP的正式规范在RFC0768中,在文档中提及了UDP采用的是“尽力而为”的模式,意思是把应用程序传给IP层的数据发送出去,但是并不保证是否可以到达目的地。这也是因为它的无连接特征,所以校验和是十分的重要。但是UDP并非一无是处,它就突
2022-01-20 17:33:25
2947
原创 SIP协议学习(2)-协议实例
SIP实例使用位置服务和 DNS 请求地址解析示例该实例未显示传入和传出代理服务器,而仅显示了中间的一个代理服务器(Proxy Server)。这种简单的网络配置可能适用于在小型专用网络。SIP用户代理A希望向另一个由SIP URI sip:userb@there.com标识的用户代理B发送通用的SIP请求A首先需要知道B的SIP服务器地址,所以去查询DNS服务器,通过SRV去记录传输协议、通过NAPTR记录SIP服务器的地址将记录带回将SIP请求发送到代理服务器代理服务器告知A已接收
2022-01-07 17:49:17
1719
1
原创 CRC冗余校验
目的 是一种最常用的差错校验码。用于以太网的帧格式中,当传输错误时,帧的二进制可能产生错误。所以出现了CRC,有效荷载区之后的最后字段提供了对于帧的完整性的检查。根本思想 在帧的后面添加二进制的0,个数由”模2除法“的除数决定。在进行该除法后将余数添加在原始帧的后方,然后就将这个新的帧进行发送。例 例如原始帧为10110011。首先选择一个数作为除数,这里假设使用11001。除数可以随机选择,但是首位和末位必须为1。当我们在这里选择了5位的除数时,那么就在原始帧的后面添0,添加0的个数为5-
2022-01-05 16:34:49
911
原创 DHCP协议
DHCP DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,是一个应用层协议。将主机的IP地址设置为动态分配时,DHCP服务器就会根据DHCP将IP地址分配给客户端,使客户端可以通过这个IP地址进行上网的操作。背景 DHCP协议的前身是BOOTP协议,BOOTP被创建出来的目的也是为了分配IP地址但是只能实现有限的主机配置,后来被DHCP所取代。因为DHCP的功能更加的强大,也更加的复杂。工作流程 客户端的操作系统生成一个DHCP d
2022-01-05 13:19:26
670
原创 TCP协议
简介TCP是一种面向连接的单播协议,在发送数据之前,通信双方之间需要建立起连接。连接的建立和终止连接需要用到两端的IP地址和端口号连接分成三个阶段,分别是启动、数据传输和退出。连接过程TCP的连接通常被称为三次握手,采用客户机到服务器的请求方式。连接过程如下客户端打开应用,同时向服务器发送连接请求,SYN=1,seq=x服务器的应用被动打开。若同意客户端的请求,发回确认报文。SYN=1,ack=x+1。ACK=1,seq=y。客户端此时收到了来自服务器的确认报文,向服务器发送
2022-01-04 14:59:25
1280
原创 SIP协议学习(3)
SIP与ENUM的结合ENUM电话号码到URL的映射,实际上是一种将E.164国际电话号码映射为相应的URL地址的机制。一个电话号码对于主叫用户来说可以使用电话号码给被呼叫用户打电话、发传真或者发电子邮件。作为被呼叫的一方,可以规定通过自己单一的电话号码的接入方式,即通过自己的唯一接入方式的电话号码所对应的传真号码和电子邮件地址等,可以通过改变DNS服务器中的相应的记录容易更改他们的联络信息,不必去修改单一电话号码。在ENUM机制中,将E.164号码转换为DNS域名,利用已经存在的DNS业务。使用为支
2022-01-04 10:10:17
595
原创 SDP协议
SDP协议介绍 是一种会话描述格式,它不属于传输协议。 SDP是一种基于文本的协议,这样它的扩展性就比较强,具有广泛的使用范围,但是不支持会话内容以及媒体编码的协商。协议传输信息包括以下内容媒体类型(音频、视频)传送协议媒体格式传输地址和端口语法结构 SDP会话内容由多个形式的 type = value 的文本行组成type:一个大小写敏感的字符,需要进行区分。value:是一个结构化的文本串,需要进行大小写的区分。会话文本行 在SDP中有些文本行的描述是可以省略的
2021-12-30 09:59:27
175
原创 SIP协议学习(1)
协议起源SIP(Session Initiation Protocal)成为会话发起协议,是一种实现实时通信应用的信令协议。所谓的会话指的是用户之间的数据交换。在SIP协议中数据可以是不同类型的数据,例如文本数据、经过数字化处理的音视频数据,所以具有很大的灵活性。SIP协议是由IETF组织实现的协议,在实现这个协议的时候,IETF很大程度上借鉴了其他广泛存在于Internet中的协议,例如HTTP、SMTP等协议。这些协议都是基于文本的编码形式,SIP很好的继承了这一点,这也是SIP协议和音视频其
2021-12-29 17:02:40
2139
原创 Effective C++之绝不再构造和析构函数中调用virtual函数
假设有两个类之间有继承的关系,在以下代码中只多态了一种加法的情况。执行情况如下主函数中定义了Add的一个对象,肯定会调用Add的构造函数。但是在此之前首先调用Cal这个类的构造函数。调用Cal构造函数,调用getResult函数。但是此时的这个函数是Cal中的并不是子类当中的。子类当中的getResult函数中使用到了成员变量,但在构造Cal时,成员变量还没有进行初始化。引发了警告。#include <iostream>using namespace std;class C
2021-12-22 16:05:42
213
原创 C++11 右值引用
右值引用&&:右值引用专用符号特点:int n = 5;int&& a = 5 * n;int m = a + 2 ;特点1: 5 * n为右值,所以可以进行引用,a来接收。可以继续使用aint&& a = n;特点2:n为左值,无法进行右值引用,所以这句话会报错,如果想使用n可以通过move移动语义进行操作:int&& a = move(n);首先在使用右值引用时,首先要了解为什么要使用右值引用。右值引用
2021-12-13 22:09:18
510
原创 c++ 二叉排序树
二叉树在使用链表的时候,我们碰到的问题都是一对一的线性结构,然而当碰到一对多的时候,链表就无法使用。此时我们需要一对多的数据结构——树。树是非线性的数据结构。现实生活的树长这样而今天要介绍的二叉树和树确实长得很像。关于二叉树的性质每个节点最多可以有两个子节点,并且子树都有左右之分,次序不能颠倒。二叉树的第i层最多有2的i次方-1个节点,第一层为图中最上层A,往下依次增加。深度为n的二叉树,最多有2的n次方-1个节点,深度就是从上往下的层数,图中A为一层,BC为一层,DEFG为一层,所
2021-12-06 18:19:11
949
原创 c++11 条件变量
条件变量(condition_variable)条件变量是线程以睡眠的一种形式等待某一条件的发生,所以称之为条件变量。条件变量利用的是线程共享全局变量来进行同步,所以全局变量一般会被设置为线程睡眠结束开始运行的条件。Mutex条件变量一般用于和互斥锁一起使用。在使用条件变量时,需要引用、头文件#include <condition_variable>。condition_variable的对象调用wait函数时,它会通过定义的lock锁定住线程,当前线程被阻塞,不会执行wait下面的
2021-12-02 16:32:09
1244
1
原创 c++链表
链表链表是一种数据结构,是由一系列的结点构成的。每一个结点中至少包含两个元素。一个是结点的元素值,另一个指向下一个结点的指针。如果只包含向后的指针,那么就是为单链表。一个形象的比喻:单链表其实就是像寻找宝藏一样。例如宝藏需要集齐十块拼图。那么肯定要从第一块拼图开始找起,当你获取了第一块之后,那么第一块拼图会告诉你第二块拼图在哪里,以此类推,当你找寻完十块拼图,也就是遍历了整个单链表。...
2021-11-30 22:56:14
1983
原创 c++ 多线程
线程的基本了解线程是被CPU执行调度的最小单位。被包含于进程中。例如打开网页时,可以打开一个网页,也可以点击+号打开第二个网页。每一个网页都是一个多线程,而整个程序被称为多进程。所以每个进程至少包含一个线程。c++98中没有明确的提出线程这一概念,直到c++11中引入了线程技术。在使用线程时,需要引入头文件thread。创建一个线程void fun1()//线程1{ cout << "这是一个线程" << endl;}void fun2(int num)
2021-11-25 22:43:02
733
原创 c++ STL之list
list非连续的线性空间分配,每次插入或者删除一个元素就会配置或者释放一个元素的空间。所以,每次元素的插入或者删除都是常数时间。是一个双向链表。并且插入和接合操作都不会造成迭代器的失效。初始化list<int> a1 = { 1,2,3,4,5,6,7 };list<int> b(3, 5);//初始化3个5list<int> c(a1);//用a来初始化clist<int> a{ 2,2,3,4,5,6,7 };插入与删除 list&
2021-11-24 14:16:02
615
原创 c++ STL之vector
vector容器,底层为一个数组。与array十分相似。但是array是静态空间,而vector是一个动态的空间。这就是为什么vector的方法中有容量(capacity)和大小(size)的两个方法。本文将会对这两个方法进行区分。初始化 vector<int> a = { 1,2,3,4,5,6 };//定义一个类型为int类型的容器a,并且初始化为1~6 vector<int> b(10);//定义一个容器大小为10的b容器,初始值不确定 vector<in
2021-11-20 20:21:42
1076
原创 八大排序(上)
冒牌排序最基础的算法之一,需要依次比对相邻两个元素的大小。如果是按照从小到大排序,在第一轮结束后会获得一个最大的值放在了数组最尾部。依次进行第2,3…轮比较。将所有元素排序。时间复杂度:O(n^2)空间复杂度:O(1)特点:稳定、不复杂int main(){ int a[] = { 22,54,98,56,87,25,99,131,1,42 }; for (int i = 0;i < 10 - 1;i++)//十个数只要进行9次比较 { for (int j = 0; j <
2021-11-16 23:03:43
82
原创 c++ static_cast等强制类型转换
static_cast原型:static_cast < type-id > ( expression )type-id:代表想转换为的数据类型expression :代表所想转换的变量该转换符有以下几个特点大多数用于数值类型数据的类型转换不执行运行时的类型检查,因此安全性较低。用于非多态类型的转换int main(){ double a = 1.34; int b = static_cast<int>(a); cout<<
2021-11-13 19:44:16
1114
原创 时间复杂度计算
时间复杂度计算理解算法的方式:大家都知道,衡量一个程序好坏有两个标准。占用时间占用空间那么时间复杂度如何才能在写代码时就可以进行推算呢?下面就进行举例说明int main(){ int a = 2;//1 int b = 3;//2 return 0;//3}int main(){ int a = 2,b = 3; return 0;}很明显,这个代码执行了三次,那么它的时间复杂度是3吗?如果将声明改成了第二个代码情况,完全一样,难道就
2021-11-12 11:35:14
291
原创 c++ Lambda语法
Lambda看似很难懂的语法,其实就是一个函数,只是这个函数省略了名字。#include<iostream>using namespace std;int main(){ auto demo = []()->int {}; return 0;}上段代码中,就是一个lambda表达式的基础语法demo是一个Lambda表达式的一个对象。可以理解为相当于函数名,[]中则是代表了形参的类型下面将会一一介绍。()中则是引用的形参列表,->后面为返回值的类型,{}
2021-11-11 14:08:00
569
原创 c++11 Lambda浅显实战理解
c++11 Lambda表达式先看一个使用Lambda和不使用Lambda的区别例:#include <iostream>#include <vector>#include <cmath>#include <algorithm>using namespace std;bool f3(int x){ return x % 3 == 0;}int main(){ int count = 0; vector<int>
2021-11-09 22:35:10
727
原创 c++ 单例模式
单例模式单例模式很明显,就是只能存在一个实例。所以随之想到的就是将类的构造函数变成私有函数,这样外界就无法创建实例对象。那么应该在什么时候生成实例对象呢?此时就分成了单例模式的两种不同方案。饿汉模式可以把一个类想象成一家蛋糕店,饿汉很饿,所以进蛋糕店时就要立刻消费,买东西吃。所以,饿汉模式在类创建时就生成了对象。 #include<iostream>using namespace std;class Singleton{private: Singleton() { co
2021-11-08 23:24:29
101
原创 c++ 工厂模式
在熟悉工厂模式之前,首先要明白在写c++程序前的六大准则开闭原则:不修改已存在代码,只添加代码。依赖倒转原则:不用具体类解决问题,使用抽象类。(隔离变化,封装变化)里氏代换原则:任何基类可以出现的地方,子类一定可以出现。接口隔离原则:使用接口抽离逻辑,目的也是为了降低耦合。迪米特法则:类和类之间不发生相互作用,使得功能互相独立。单一职责原则:一个类只有一个可以引起它变化的原因工厂模式分为三类,以下将会介绍简单工厂和工厂模式简单工厂只有一个抽象类,所以它存在的缺点是工厂类中集中了所有的创
2021-11-08 22:15:36
1471
原创 c++11 智能指针
c++11 智能指针c++中时常发生内存泄漏问题,在c++98中引入了auto_ptr指针,然而在c++11中已经摒弃了auto_ptr,新引入了三种智能指针模板(shared_ptr、unique_ptr、weak_ptr)。首先我们需要了解内存是如何分配的?void demo1(){ int * pd = new int; *pd = 10; return;}demo1中,未使用任何智能指针。变量的分配步骤为三步,如此pd的内存并没有被释放。为pd和一个int值分配存储空间将值
2021-11-06 01:55:41
92
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人