自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 服务端和客户端之文件加密传输

1.前言1.1 why?闲来无事,自己研究了一下服务端与客户端之间的文件传输,主要是服务端创建套接字开启监听并等待客户端的连接(TCP),在TCP协议上,为了安全我使用了TLS1.2进行加密通信(OpenSSL库),同时为了文件内容的安全,我在服务端对文件进行了加密(AES),客户端接收到文件后在对其解密。2.2 硬件我用的电脑系统是ubuntu 16.04,不是windows,下面的代码...

2019-09-03 20:28:41 2803

原创 OpenSSL简介

1.OpenSSL简介1.1 简介SSL为了让网络通信更安全,简单来说就是在TCP之上做一个安全通信层,HTTP on SSL即是HTTPs。SSL交互过程还是很复杂的,牵扯到非对称加密和对称加密,以及复杂的交互过程,为此有人写了OpenSSL库。1.2 SSL和TLSSSL是TLS的前身,SSL从1.0、2.0到3.0一步步修订,但安全性都不是非常完美。知道后来SSL3.0摇身一变变成T...

2019-08-28 11:28:11 482

原创 基于HTML5的简单的websocket客户端

一个简单的websocket客户端<!DOCTYPE html><html><head><meta charset="UTF-8"><title>WebSocket Client</title></head><body> <scr

2018-08-08 15:05:23 1824

原创 Shell脚本工具

1.grep 2.sed3.awk

2017-07-03 19:41:46 691

原创 基于shell脚本的进度条

Linux下建立一个shell文件bar.sh代码如下#!bin/bash #注意这里的#不是注释i=0str=""arr=("|" "/" "-" "\\")while [ $i -le 100 ]do #printf "\033[?25l" #隐藏光标 #printf "\033[41m" #红色背景 printf "\033[42m\033[1m" le

2017-06-28 16:56:09 412

原创 倒引符 eval和$()

1.倒引号 倒引号括起来的字符串被shell解释为命令行,在执行时,Shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。 例如: “echo current directory is pwd ” “ current directory is /home/lichao/bite/shell” 2.$() ()中放的是命令,相当于‘‘,例如todaydate=( )中放

2017-06-26 19:59:03 635

原创 poll服务器

int poll(struct pollfd fds[], nfds_t nfds, int timeout); 头文件:poll.h 参数说明: fds:是一个struct pollfd结构类型的数组,用于存放需要检测其状态的Socket描述符;每当调用这个函数之后,系统不会清空这个数组,操作起来比较方便;特别是对于socket连接比较多的情况下,在一定程度上可以提高处理的效率;这一点与se

2017-06-22 15:50:09 291

原创 Linux-死锁

1.什么是死锁? 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 2.死锁产生的四个必要条件 (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3)

2017-06-19 20:27:03 328

原创 TCP握手和挥手

二、TCP连接的建立和终止1、建立连接协议 (1) 请求端发送一个SYN段指明客户打算连接的服务器的端口,隐疾初始序号(ISN),这个SYN报文段为报文段1。 (2) 服务器端发回包含服务器的初始序号的SYN报文段(报文段2)作为应答。同时将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。 (3) 客户必须将确认序号设置为服务器的ISN加1以

2017-06-19 17:05:26 274

原创 TCP定时器

TCP 是提供可靠的传输层,它使用的方法之一就是确认从另一端收到的数据。但是数据和确认都可能会丢失。TCP 通过在发送时设置一个定时器来解决这个问题。如果当定时器溢出时还没收到确认,它就会重传该数据。关键在于超时和重传策略,即怎样决定超时的时间间隔和如何确定重传的频率。 TCP定时器种类 对于每个TCP连接,TCP管理4个不同的定时器。  (1) 重传定时器用于当希望收到另一端的确认。  (

2017-06-19 16:32:13 334

原创 TCP中的URG和PSH

TCP的推送比特PSH(Push) PSH是TCP报头中的一个标志位,发送方在发送数据的时候可以设置这个标志位.当两个应用程序进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应.在这种情况下,TCP可以使用推送(push)操作.这时,发送端TCP将推送比特PSH置为1,并立即创建一个报文段发送出去.接收TCP收到推送比特置1的报文段,就尽快地(即”推送向前”)交付

2017-06-19 16:08:54 544

原创 网络端口

1.网络端口 TCP/IP协议中的端口 端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。 端口分类 按端口号可分为3大类: (1)公认端口(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。 (2)注册端口(Regist

2017-06-19 15:18:19 502

原创 路由算法

1.路由算法概念 路由算法,又名选路算法,可以根据多个特性来加以区分。算法的目的是找到一条从源路由器到目的路由器的“好”路径(即具有最低费用的路径)。算法设计者的特定目标影响了该路由协议的操作;具体来说存在着多种路由算法,每种算法对网络和路由器资源的影响都不同;由于路由算法使用多种度量标准(metric),从而影响到最佳路径的计算。 2.常见的路由算法 LS算法 采用LS算法时,每个路由器必

2017-06-18 22:39:32 1511

原创 NAT技术与代理服务器

1.NAT技术 简单的说,NAT就是在局域网内部网络中使用内部地址,而当内部节点要与外部网络进行通讯时,就在网关处,将内部地址替换成公用地址,从而在外部公网(internet)上正常使用,NAT可以使多台计算机共享Internet连接,这一功能很好地解决了公共IP地址紧缺的问题。 2.NAT实现方式 NAT的实现方式有三种,即静态转换Static Nat、动态转换D

2017-06-18 22:16:37 458

转载 CRC校验

1.基本概念 CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

2017-06-17 20:34:45 317

原创 Linux-管道

管道-pipe 在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为: · 限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不像文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能

2017-06-16 15:31:19 461

原创 Linux-线程(一)创建 终止 等待线程

注意:在Linux上线程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项。 1.线程概念 1)线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,

2017-06-15 10:53:08 436

转载 线程安全与可重入函数

一、线程安全 线程安全:如果一个函数在同一时刻可以被多个线程安全的调用,就称该函数是线程安全的。不需要共享时,请为每个线程提供一个专用的数据副本。如果共享非常重要,则提供显式同步,以确保程序以确定的方式操作。通过将过程包含在语句中来锁定和解除锁定互斥,可以使不安全过程变成线程安全过程,而且可以进行串行化。 很多函数并不是线程安全的,因为他们返回的数据是存放在静态的内存缓冲区中的。通过修改接口,由

2017-06-14 21:42:46 346

原创 Linux-信号(二)pending

1.阻塞信号 实际执⾏信号的处理动作称为信号递达(Delivery),信号从产⽣到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block )某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞才执行递达的动作。注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的⼀种处理动作。 每个信号都有两个标志位分别表⽰阻塞(block)和未决

2017-06-14 20:20:06 665

原创 Linux-终端、作业控制与守护进程

1.进程组 每个进程除了有一个进程ID之外,还属于一个进程组.进程组是一个或者多个进程的集合. 通常他们与同一作业相关联,可以接受来自同一终端的各种信号.每个进程组有一个唯一的进程组ID,每个进程组都可以有一个组长进程.标识为:其进程组ID等于其进程ID 组长可以创建一个进程组,创建其中的进程,然后终止.只要组内有进程,则该进程就存在,与组长存亡无关 2.作业 Shell分前后台控制的不是

2017-06-12 20:12:15 520

原创 Linux-信号(一)

1.信号的基本概念: ①信号是很短的消息 ②标准信号:标准信号没有给参数、消息或是其他相随的信息留有空间 ③通常使用一个数字来标识一个信号 ④信号可以被发送到一个进程或一组进程。 2.信号的目的: ①让进程知道已经发生了一个特定的事件 ②强迫进程执行它自己代码中的信号处理程序 a.很多应用程序提供自己的信号处理程序 b.系统也会定义一些缺省的信号处理程序信号举例

2017-06-12 15:51:27 322

原创 Linux-条件变量

1.条件变量 条件变量描述临界资源内的状态。 条件变量是线程中的东西,就是等待某一条件的发生,和信号一样。 条件变量使我们可以睡眠等待某种条件出现。 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待”条件变量的条件成立”而挂起;另一个线程使”条件成立”(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起 返回值:成功返回0,失败返

2017-06-10 11:36:22 376

原创 红黑树

1.红黑树简介 红黑树(Red Black Tree) 是一种自平衡二叉查找树,红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色

2017-06-08 11:06:47 264

原创 二叉搜索树及其模拟实现

1.二叉搜索树(二叉排序树)的定义 二叉搜索树或者是空树,或者具有以下性质的二叉树: ① 若左子树为空,则左子树上所有结点的关键字值均小于它的根节点的关键字值。 ② 若右子树为空,则右子树上所有结点的关键字值均大于它的根节点的关键字值。 ③左右子树本身又是一颗二叉搜索树。 2.二叉搜索树的查找 查找思路为:若待查找数据元素的关键字值等于二叉搜索树根节点的关键字值,则查找成功;若待查找数据

2017-06-03 00:03:35 419

原创 栈和队列的基本概念和操作

栈和队列1.栈的定义 栈是限定只能在一端进行插入和删除的线性表。允许进行插入和删除操作的一端称为栈顶,另一端为栈底。当栈中没有元素时,称为空栈。 栈的特点是“后进先出”(Last In First Out,LIFO),即后入栈的元素先出栈。2.队列定义 队列是限定在一端进行插入,在另一端进行删除的线性表。队列中允许插入一端称为队尾,允许删除的一端称为队头。 在队尾插入元素的操作

2017-05-18 19:53:10 2634

原创 树和二叉树(四)-线索化二叉树

线索化二叉树

2017-05-16 13:50:35 260

原创 树和二叉树(三)-线索二叉树

二叉树是一种非线性结构, 遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。 用二叉树作为存储结构时, 取到一个节点, 只能获取节点的左孩子和右孩子, 不能直接得到节点的任一遍历序列的前驱或者后继。 为了保存这种在遍历中需要的信息, 我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。 通过对二叉链表的分析可知,存储n个结点的二叉链表具有n+1个空指针域。线索二叉树正是

2017-05-15 21:34:17 564

原创 树和二叉树(二)

以下是二叉树的基本代码#include<iostream>#include<assert.h>#include <stack>using namespace std;template<class T>struct BinaryTreeNode { T data; BinaryTreeNode<T>* _left;

2017-05-14 21:34:13 253

原创 树和二叉树(一)

二叉树的基本概念 二叉树的定义:二叉树是n(n>=0)个结点构成的有限集合。当n=0时,它是一棵空二叉树;当n>0时,它由一个根节点和两棵互不相交的,分别称作左子树和右子树的二叉树构成。 (1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。 (2)满二叉树——除了叶结点

2017-05-11 11:18:56 402

原创 模拟实现STL (双)链表

#include<iostream>using namespace std;#include<assert.h>#include<list>#include<vector>template<class T>struct _ListNode{ T _data; _ListNode<T>* _next; _ListNode<T>* _prev; _List

2017-05-02 00:07:33 313

原创 atexit函数

函数名: atexit 头文件:#include#include<stdio.h>#include<stdlib.h>void fun1(){ printf("fun1():");}void fun2(){ printf("fun2():");}void fun3(){ printf("fun3():");}void fun4(){ print

2017-04-24 19:29:41 344

原创 C++强制类型转换

static_cast static_cast⽤于⾮多态类型的转换(静态转换),任何标准都可以⽤它,但它不能⽤于两个不相关的类型进⾏转换。对应于C的隐式类型转换。void test(){ int i = 1; double j = static_castint>(i); printf("%d, %.2f\n", i, j);}reinterp

2017-04-21 18:47:03 309

原创 C++异常

异常处理 异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理。异常使得我们能够将问题的检测与解决过程分离开来。异常的抛出和捕获 在C++中,我们通过抛出一条表达式来引发一个异常。被抛出的表达式的类型以及当前的调用链共同决定了哪段代码将被用来处理该异常。被选中的处理代码是在调用链中与抛出对象类型匹配的最近的代码。 当执行

2017-04-19 12:40:48 422

原创 指针和引用

指针和引用引用 引用:引用不是一个新的变量,而是一个已经存在的变量的别名。比如你同学在学校叫你王五,回到家里,家里人叫你小王一样,虽然叫法不同,但实际上指的都是一个人。 下面看一段代码void test(){ int a = 1; int e = 4; int &b = a;//引用的格式:类型 &引用变量名=已定义过的变量名 //int &b;//这样是非法的

2017-04-17 17:15:58 274

原创 C++智能指针(三)总结

在上一篇博客中(C++智能指针(二))模拟实现了三种智能指针。 其中最好的就是shared_ptr,但是这并不代表它就是最完美的,它也有问题,这个问题就是循环引用问题。下面用一段代码来解释说明循环引用问题。#include<memory>struct ListNode{ shared_ptr<ListNode> _next; shared_ptr<ListNode> _pre

2017-04-16 15:36:59 469

原创 C++智能指针(二)模拟实现三种智能指针

在上一篇博客中提到了Auto_ptr(C++智能指针(一)),下面进行模拟实现Auto_ptr 采用类模板实现#include<iostream>using namespace std;template<class T>class Autoptr{public: Autoptr(T* ptr = NULL) :_ptr(ptr) {} //Auto

2017-04-15 20:34:40 1280

原创 C++智能指针(一)智能指针的简单介绍

C++智能指针 在正式了解智能指针前先看一下下面的一段代码#include<iostream>using namespace std;class A{public: A() :_ptr(NULL), _a(0) {} ~A() {}public: int* _ptr; int _a;};void test(){

2017-04-14 23:40:18 539

原创 Linux下的task_struct

以下涉及到的进程都是在Linux环境下 什么是进程? 所谓进程就是程序的一个执行实例或者是能分配处理器并由处理器执行的实体。 Linux下所有的进程信息被放在了一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。 进程控制块 每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux下进程控制块是task_struct结构体。这个结构体中包含了以下内容 标示符 :

2017-04-13 11:53:03 315

原创 C++继承(四)对象模型

*虚函数表:虚函数表是通过一块连续的内存来存储虚函数的地址 下面是一段程序class A{public: virtual void fun1() {} virtual void fun2() {}private: int a;};void test(){ A s;}int main(){ test(); system(

2017-04-13 11:34:42 380

原创 C++模板

模板是泛型编程的一种,所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用方式,模板分为模板类和模板函数下面是几个普通的函数调用#includeusing namespace std;bool IsEqual(int left, int right){ return left == right;}bool IsEqual(const string& left, con

2017-04-10 20:45:59 342

空空如也

空空如也

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

TA关注的人

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