自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Webrtc (一):协议

目录前言signaling server前言WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。webrtc属实好玩,来好好学一下。signaling serve

2021-04-01 20:40:42 525

原创 子网和超网

目录前言问题解决思路划分子网构造超网前言我们原本的IP地址是二级IP地址,且分成五类。但是确实不太合理,会出现一些问题,今天来探讨下这些问题以及解决的一些策略。问题原本分为五类的IP地址如下:如上,IP地址 ::= {<网络号>,<主机号>}那这样的分配有什么问题呢?1、地址的空间利用率有时候很低B类和C类地址能容纳的主机数相差很多。但是有的公司为了以后的发展,不选择足以使用的C类地址,而是使用B类地址,造成很多地址空闲浪费。2、给每一个物理网络都分配一个网络号会

2021-03-28 13:02:01 901

原创 经典链表翻转(递归)

目录前言链表翻转非递归递归链表每k个节点翻转非递归前言链表翻转是很典型的场景案例了。在面试中被问过,挺有趣的,记录下。链表翻转给定一个链表,将其翻转,如下理解起来是很简单的。下面给定链表节点的结构 struct ListNode { int val; struct ListNode *next; };非递归对于翻转这个动作,例 A->B->NULL ,可以当A的父节点也是NULL。则:(1)当前节点为A,前一个为NULL,A->next 指向NULL(2

2021-03-27 16:43:51 546

原创 TCP 的拥塞控制

目录前言拥塞TCP的拥塞控制方法慢开始拥塞避免算法快重传快恢复小片尾(主动队列管理AQM)前言之前提到了TCP的流量控制,我们知道了发送方与接收方两点之间如何控制通信的流量。流量控制有助于防止 A发送的数据超过了B的缓冲区。但是网络环境中,发送方和接收方中间可能要经过很多的路由器等复杂的环境,并不是简简单单的两点通信。网络中的带宽的数据又很复杂, 所以呀引进了网络堵塞的概念,然后TCP又要防止在网络中堵塞,所以引进了拥塞控制的概念。拥塞计算机网络中有许多帮助连接的资源(链路容量(带宽)、交换节点中的

2021-03-27 15:06:16 504 2

原创 TCP流量控制

目录前言流量控制一个问题一些问题前言流量控制也是TCP一个很重要的功能。在前面TCP可靠传输的实现 中已经提到了一个移动窗口的概念。通信双方都各自维护自己的发送窗口和接收窗口,发送方根据接收方的TCP首部的窗口字段调整自己的发送窗口大小。流量控制那今天要提到的流量控制就是让发送方的速率不要太快,使接收方来得及接收。若来不及接收可能会导致信息丢失(缓冲区溢出?)。其实前面TCP可靠传输那篇文章提到的窗口的移动就是流量控制的关键,接下来来看一个例子使这个概念更清晰。情景A向B发送数据,建立连接时

2021-03-26 16:58:40 318

原创 STL容器(三):deque

目录前言deque结构中控器(map)迭代器(iterator)例子deque 操作前言deque是一个很好用的双端队列,在头部或尾部插入删除复杂度都为O(1) 。关于deque操作方面就不怎么提了,和 vector 差不多 。这篇文章主要记录下deque的底层结构,这才是它有趣的地方。deque结构包括三个部分:迭代器(iterator)、中控器(map)、缓冲区(实际储存地址)。它们的关系如下图所示。中控器(map)这个结构也叫map,但是和STL里的map不一样,对于它来说,它是一个二维

2021-03-25 21:46:40 185

原创 缺失数字(异或)

目录题目解析题目题目描述从0,1,2,…,n这n+1个数中选择n个数,组成有序数组,请找出缺失的那个数,要求O(n)尽可能小。解析异或大法。只需要知道一些异或的性质异或后为0 仅当 两个数分别为0和1自己异或自己结果为 0class Solution {public: /** * 找缺失数字 * @param a int整型一维数组 给定的数字串 * @param aLen int a数组长度 * @return int整型

2021-03-25 15:41:54 307

原创 TCP 可靠传输的实现

目录前言功能描述窗口前言之前了解了TCP首部不同字段的意义,今天来看它们的第一个功能,可靠传输。下面再看一波首部样子留点印象。功能描述可靠传输无差错、不丢失、不重复、按序到达接下来看看为了实现这个TCP搞了哪些东西。窗口...

2021-03-25 12:27:48 800

原创 两个链表相加生成新链表

题目描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。 例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为1->0->0->0。思路利用栈先将所有的数字存储好,然后弹出来相加即可。/** * struct ListNode { * int val; * struct ListNode *next; * }; */class.

2021-03-24 22:11:27 383

原创 STL容器(二): vector

目录前言vector简介功能特性操作前言vector永远的神,每当别人问用什么容器最多,我就说vector(其它的太难了 )。vector简介vector表现得像个动态数组,可实际上底层还是利用静态数组实现的。如图,vector 一开始会申请一个足够大的数组,然后我们已经插入的元素个数为 size,最大容量为 capacity 。要使用 vector ,需要加入 #include < vector > 头文件,类定义如下:namespace std{ template <

2021-03-24 20:49:36 132

原创 STL容器(一): array

目录前言array简介功能初始化非修改操作swap迭代器前言一直觉得STL是C++最有利的武器之一,今天开个坑来学习一下。先从最好欺负 容易学的Array开始,fighting!array简介array内部其实是封装了一个简单的静态数组。并且在创建时就要确定数组的大小,在对象生命期结束前数组的长度都维持在这个大小。如果需要使用这个容器,要在头文件中包含 #include < array > ,它也是在std命名空间里的。using namespace std{ template

2021-03-24 19:02:33 298

原创 最长公共子串(动态规划)

目录题目思路代码题目题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一。 示例1输入"1AB2345CD",“12345EF” 返回值 “2345”思路动态规划的典型例子,要想好状态怎么变化。在这里用二维数组保存状态,假设 字符串为 123 ,12 。则有一开始状态:*12312然后12310+1=100201+1=20

2021-03-23 20:38:09 392

原创 UDP和TCP报文格式

目录前言UDP(用户数据报协议)特性首部结构TCP特性首部格式前言运输层有TCP和UDP两个协议。都是为了支持不同主机间的进程的通信,端到端之间的通信是应用进程间的通信。运输层提供的就是端到端间的逻辑通信,因为在两个主机是没有一条真正的线路连接的。在获得应用层的数据后,传输层要向下封装IP报头再到数据链路层封装成帧,然后再发送出去。通过上面两个应用之间通信的概念图片也能发现路由器是不负责传输层的。UDP(用户数据报协议)用户数据报协议UDP只是在IP协议上增加了一点功能,也就是复用和分用以及差

2021-03-23 20:17:24 793

原创 网际控制报文协议 ICMP

目录介绍种类差错报文查询报文介绍ICMP(Internet Control Message Protocol)是一个在网络层的协议,ping 命令就是使用的 ICMP 协议。注意,ICMP不是高层协议,ICMP报文是封装在 IP数据报中,作为其中的数据部分。种类ICMP报文有两种种类:ICMP差错报文,ICMP询问报文。报文前四个字节是固定的,分别是类型、代码、 检验和。接着四个字节和报文的种类有关。最后是数据字段,其长度取决于ICMP的类型。代码字段是为了进一步区分某种类型中的不同情况。检

2021-03-18 12:26:42 197

原创 三种线性排序:计数排序、基数排序、桶排序

目录前言决策树线性时间排序计数排序前言之前学到的归并、快排、堆排序等其实都可以归为比较排序,因为一定要通过数字之间的比较才知道数字的次序。对于堆排序和归并排序,时间复杂度上界都是 O(nlog(n)),对于快速排序,平均到了O(nlog(n))。决策树比较排序都可以抽象为像上图一样的完全二叉树。可以表示在给定输入规模的情况下,一个排序算法对所有元素的比较操作。当到达叶节点时,就确定了一个正确的排序。根据上面的例子可以看出,当比较次数最多的时候就是到达叶子节点的时候。在最坏情况下,任何比较排序都要

2021-03-17 16:35:12 270

原创 堆排序和优先队列

目录堆操作维护堆的性质(MAX-HEAPIFY)建堆堆排序算法(HEAP-SORT)优先队列堆今天看看堆,这里的堆不是操作系统堆栈的堆,而是一个二叉树的结构。它不仅可以用来实现堆排序,还可以构造一种有效的优先队列。(二叉)堆是一个数组,也可以被看作是一个近似的完全二叉树。树上的每一个结点对应数组中一个元素。除了最底层外,该树是完全充满的,而且是从左向右填充。这样我们很容易就能根据下标找到一个节点的父节点下标或子节点下标。Parent(i): return i/2;LeftChild(i):

2021-03-16 20:48:54 338

原创 HTTP 常见状态码

这是个挺常见的问题,一般碰到什么码没见过直接搜就行。总共有五类:1xx:第一类提示信息:表示目前是协议处理的中间状态,还需要后续的操作;例如:POST发送的第一个包就是等服务器返回1xx响应表示POST可以继续发送数据。2xx:成功,报文已经收到且处理掉了[200 OK]: 最想看到的就是这个,表示一切正常。[204 NO Content]: 响应时没有body数据。[206 Partial Content]:说明此时 HTTP是分块下载或断点续传,表示响应返回的body数据并不是资源

2021-03-15 15:29:40 139

原创 IP 层转发分组的流程

目录路由表信息路由表信息在一个路由表中,对每条路由最主要的是以下两个信息:(目的网络地址,下一跳地址)例子我们就根据目的网络地址确定下一跳的路由器,所以可以得出以下结果:(1)IP数据报最终一定可以找到目的主机网络上的路由器(可能通过多次间接交付)(2)只有到达最后一个路由器时,才试图向目的主机直接交付。虽然互联网中所有的分组收拾基于目的主机的网络,但是也允许特例,即对特定的目的主机指定一个路由。这种路由叫特定主机路由。路由器还可采用默认路由以减小路由表所占用的空间和搜索路由表所用的时间

2021-03-15 09:14:50 4094

原创 IP数据报

目录首部固定部分各字段根据 IP 数据报的格式我们就能了解 IP协议具有哪些功能。在TCP/IP标准中,各种数据格式常常以 32 位(4字节)为单位来描述。我们可以看到,对一个IP头部,有20字节是固定的,然后后面是可选字段,它的大小是可变的。首部固定部分各字段版本号:IPv4 或IPv6首部长度:因为固定部分是20字节,而这个字段单位是 32bit(4字节),因此最小值是 5 (0101),当首部长度不是 4字节 的整数倍时,必须利用最后的填充字段加以填充。区分服务:旧标准中叫服务类型,实

2021-03-14 22:38:55 904

原创 概率分析和随机算法

目录雇用问题描述概率分析随机算法指示器随机变量雇用问题与指示器雇用问题描述一个老板想换掉自己的办公助理,并且决定每次面试一个人,如果当前这个面试者比现在的办公助理好,就雇用他,并且解聘现在的办公助理。描述成伪代码可以有如下形式:Hire-Assistant(n):best = 0 //假装有最菜的面试者,其实也可以理解为当前助理最菜for i=1 to n //遍历全部面试者 interview candidate i //取当前面试者 if candidate i is better th

2021-03-12 16:19:15 614

原创 c++ static关键字一些事

目录staticstatic引入静态数据的存储static的声明和初始化staticstatic引入考虑一个变量需要面向类的全部对象时,我们可以怎么来解决?1、使用全局变量。但是全局变量会被非这个类的函数修改。2、使用static声明类的静态变量。所以,在 C++ 中,需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见时,可将其定义为静态数据。静态数据的存储全局(静态)储存区:分为DATA和BSS段。BSS:Block Starte

2021-03-12 14:05:53 78

原创 C++的const的几种用法(带例子)

目录修饰变量和指针修饰参数const修饰成员函数const在函数中三个位置例题修饰变量和指针const修饰普通类型的变量,告诉编译器某值是保持不变的。const 修饰指针变量,根据const出现的位置和出现的次数分为三种指向常量的指针(常量指针):指针指向一个常量对象,目的是防止使用该指针来修改指向的值。指针常量:将指针本身声明为常量,这样可以防止改变指针指向的位置。指向常量的常指针:一个常量指针指向一个常量对象。#include <iostream>us

2021-03-12 13:23:53 987

原创 Mysql的ACID以及四种隔离级别

目录ACID并发事务ACIDACID就是我们常说的事务的特点。原子性(Atomic)一个事务必须被视为一个不可分割的最小单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。一致性(Consistency)一致性指事务将数据库从一种状态转变为下一种一致的状态。事务开始前和结束后,数据库的完整性约束没有被破坏。一致状态的含义即数据库中数据应满足完整性约束。举个栗子,用户A和B的总资产加起来一共200元,他们之间相互

2021-03-12 09:28:32 290

原创 关于网络性能的一些指标

目录1、速率2、带宽3、吞吐量4、时延 (重要)5、时延带宽积6、往返时间RTT (重要)7、利用率接下来准备好好学习一下网络方面的知识,之前的自学都浮于表面。我们都知道网络用于端对端的一个信息传递,那么今天先了解一下信息传递时描述网络性能是怎么样的一些指标。1、速率我们平时传输的数据都是比特流(bit),一个比特也就是 0 或 1。因此我们平时上网看到的传输速率就是 bit/s 。下面是一些换算,数据传输比较快时,我们也能看到:kb/s = 1000 bit/smb/s = 1000 kb/

2021-03-10 21:44:21 2478

原创 Socket基础及连接过程

目录Socket APIsocketbindlistenACCEPT在网络编程中经常使用的就是socket来进行两台机器间的通信。在自己的项目里还用上了EPOLL来监听socket的缓冲区信息变化。但是socket连接和通信与网络连接的关系是怎么样的呢?接下来就来看看。Socket API首先看socket的API:socketsocket(int domain, int type, int protocol)man socket :socket() creates an endpo

2021-03-09 11:50:13 3629

原创 使用Union判断大小端

今天看了一手Union,之前都快忘光了,想起大小端才有点印象。Union,也就是联合体。在C++中可以从来处理 n选1 的变量占用同样内存,从而达到节省资源的目的。例如看下面一个例子:union demo{ int a; char b;}c;cout<< sizeof(c)<<endl;// 4 bytes也就是说,变量 a和b 都是占用着同样的内存空间。那怎么利用它来测试大端小端呢?看下面的代码。c.a = 1;return 1 == c.b;//返回1则为

2021-03-08 22:01:11 1482

原创 如何选择MYSQL储存引擎

目录InnoDB存储引擎MyISAM储存引擎要知道如何选择数据库引擎,就得先了解数据库引擎,Mysql里主要有三种数据库引擎,分别是MEMORY 、 MYISAM 、 InnoDB。 一个储存引擎的作用是提供不同的存储机制、 索引技巧 、 锁定水平等。一般把这些核心功能分为四类:支持的字段和数据类型、锁定类型、索引和处理。如何选择储存引擎?一步步看。1、使用场景是否需要事务支持;2、是否需要支持高并发,InnoDB的并发度远高于MyISAM;3、是否需要支持外键;4、是否需要支持在线热备;5

2021-03-08 16:16:55 87

原创 进程和线程的调度

目录系统分类1、批处理系统2、交互式系统3、实时系统线程调度Linux 中进程、线程调度一台计算机中时刻运行着非常多的进程和线程,但是CPU只有几个,为了显示出每个程序是“并行”的,就需要调度算法让它们合理的掌控CPU的时间。因为进程线程的切换也是很耗时的,所以对于不同的系统,需要不同的调度算法,才能使调度的好处最大化。系统分类操作系统其实有很多类,下面只讲三类。1、批处理系统批处理是指用户将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行。这种采用批量处理作业技术的操作系统称为

2021-03-07 14:21:04 682

原创 MySQL的索引

目录本质B-TreeInnoDB的B+TreeMyISAM的B+树哈希索引本质是对要查找的列建立一个能快速查找的数据结构,例如平时顺序查找就需要顺序结构,二分查找就需要二叉查找树或者红黑树等,所以我们数据库除了数据,有索引时还维护着索引的数据结构。目前常见的这种数据结构有B-Tree、B+Tree 还有hash。B-TreeB-Tree是为磁盘等设备设计的一种平衡查找树。系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一磁盘块中的数据会被一次性读取出来,而不是按需读取。I

2021-03-06 18:59:36 77

原创 关于两个主机的信息传递

目录1、交换机MAC寻址2、ARP的IP/MAC3、两台主机通讯过程1、交换机MAC寻址转发表: 局域网主机端口MAC地址与交换机端口。交换机: 根据转发表将数据帧转发到指定主机端口上。A第一次发送数据到 D:设置本地网卡MAC地址 和 目标网卡MAC地址,发送给交换机交换机收到数据后,将源MAC地址记录下来交换机检查自己的表里是否有 目的MAC地址,(1)有则直接从记录的端口发送过去 (2)没有则叫帧从所有非接收端口发送过去(这里是端口1)对于不是目的MAC的机器会忽略该帧,只有主机D

2021-03-06 12:44:18 2000

原创 C++的内存空间分布

目录变量类型1、栈2、堆堆的效率比栈要慢。3、静态储存区4、常量区5、代码区多线程时线程独自拥有哪些资源?一个进程拥有的空间。从高地址到低地址:变量类型局部常量,全局常量,全局变量,局部变量,局部静态变量,全局静态变量,局部临时变量,全局临时变量。1、栈临时变量,函数参数,局部常量。2、堆动态分配的变量。(new 或 malloc 分配的。)堆的效率比栈要慢。3、静态储存区全局静态变量,局部静态变量,全局变量。4、常量区全局常量。5、代码区存放代码。//main.cppi

2021-03-05 16:12:26 390

原创 inline 和 宏定义 区别

目录宏定义内联函数区别宏定义关键字 define。1、定义常用的不变的量。如:#define PI 3.142、定义小的函数。如:#define product(x) x*x3、防止头文件被重复包含#ifndef CODE_H #define CODE_H/** * */#endif!!!注意事项!!!宏定义本质只是简单的文本替换,发生在预处理阶段!!!所以 如果有下列定义:#define product(x) x+x然后使用为 product(1) *

2021-03-05 14:16:54 1543

原创 数据库笔记

超键,候选键,主键,外键:链接地址一对一、一对多、多对多等关系: 链接地址关系代数:链接一链接二关于join:链接地址

2021-01-11 23:08:46 3162 3

原创 Libevent学习日记(二)

Libevent学习日志(二)Ubuntu下载Libeventevent_base创建默认的event_base创建复杂的event_base后端设置与特征选择检查event_base后端接口一接口二事件优先级event_base和fork事件循环event_loop算法概要停止循环转存event_base的状态事件event生成新事件事件标志事件的未决和非未决事件优先级检查事件状态一次触发事件手动激活事件事件状态间转换Ubuntu下载Libevent使用wget获得压缩包,也可以去libevent官

2021-01-05 13:07:12 950

原创 libevent学习日记(一)

Libevent学习日记(一)Libevent简介EPOLL 与 Reactor流EPOLL API触发机制EPOLL 服务端EPOLL客户端两种高效的事件处理模式ReactorReactor结构基于Reactor反应堆的实现Proactor一些知识阻塞、非阻塞、同步、异步回调函数回调函数优点一段可执行的回调函数代码带参数的回调函数代码Libevent简介libevent是一个开源的高性能轻量级linux c++ web库。事件驱动,高性能;轻量级,专注于网络;跨平台,支持 Windows、Li

2021-01-04 20:52:46 1023 1

原创 C++多态(虚函数、静态链接、动态链接、虚函数表、虚表指针)

今天来看看C++的多态,发现一直不清晰。目录什么是多态静态多态动态多态虚函数vtable什么是多态多态字面意思就是多种状态,在有继承的类中会出现。下面来看一个例子:静态多态#include<iostream>using namespace std;class A {public: A():i(10){} void f() { cout<< "A::f()"<<i<<endl;} int i;};class B :

2020-11-06 23:20:19 842

原创 WinMIps64指令集实验

目录MIPS寄存器种类算术及寻址指令Arithmetic InstructionsLoad / StoreIndirect and Based Addressing程序结构数据声明系统调用Control Structures**Branch****Jump****Subroutine Calls**MIPS指令集实验MinMIPS64模拟器IO内存映射hello world demobubble sortMIPS寄存器种类算术及寻址指令Arithmetic Instructions!!!算术操作

2020-10-25 14:55:52 2059

原创 C++类成员函数当线程函数

C++类成员函数使用时,都会隐式传递一个this指针给该函数,this指针指向该类的对象。函数体可以通过显示调用该指针或直接访问类内成员。回调函数是通过指针调用的函数,最常使用的回调函数就是在创建线程时,以一个函数指针以及传递给这个函数多个参数来调用线程函数来创建线程。那么一般的类成员函数是不能用作回调函数的,因为库函数在使用回调函数时,都会传递指定的符合回调函数声明的的参数给回调函数,而类成员函数隐式包含一个this指针参数,所以把类成员函数当作回调函数编译时因为参数不匹配会出错。 std::th

2020-10-24 22:47:53 1528

转载 普通版 / 多进程 / 多线程 --- TCP服务器实现原理详解

大佬文章地址

2020-10-22 11:45:01 161

原创 C++ 的 __LINE__和 __FUNCTION__

Linux几个调试宏__FUNCTION__ ,TIME ,LINE ,__FILE__这几个宏是编译器内置的。__FUNCTION__ :函数名__TIME__ :文件运行的时间__LINE__ :所在行数__FILE__:文件的名字#include <stdio.h> int main() { printf("The file is %s.\n",__FILE__); printf( "The date is %s.\n", __DATE__ ); printf( "The

2020-10-19 21:25:17 562

空空如也

空空如也

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

TA关注的人

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