自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 从零开始的HTTP项目

这个项目是基于HTTP1.0版本的一个简单web服务器,主要用于练习网络编程和系统编程。使用技术:项目使用c++编写、cgi技术、多线程、 多进程(处理cgi)、socket网络编程版本1采用线程池加任务队列的方式处理请求版本2采用Reactor的设计模式,通过epoll + 线程池 + 就绪队列 + 事件池的方式编写,解决了版本1中处理cgi时工作线程阻塞等待问题。注:该项目参考Tin...

2019-01-24 16:25:23 1427

原创 TCP传输控制协议(4)--拥塞控制

拥塞控制在前面说的流量控制指的是发送方和接收方端与端的调整,而拥塞是指网络中发生拥塞,该网络中所有主机发送的数据包大于网络吞吐量,拥塞控制就是为了防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不至于过载。另外如果产生报文段的速度大于TCP下层发送数据包速度会发生本地拥塞。慢启动算法和拥塞避免算法如果一开始将大量的数据发送到网络中如果网络不能容纳这么多的包势必会造成网络拥塞,因此...

2019-01-16 21:43:16 961

原创 TCP传输控制协议(3)--数据传输(滑动窗口)

滑动窗口协议TCP发送数据时滑动窗口协议维护两个窗口结构,发送窗口结构和接收窗口结构(均为抽象结构 )发送窗口结构如上,TCP通过字节大小维护窗口,即窗口大小(TCP头部中的窗口大小)和确认序号均为字节,SND.WND有接收方提供表示接受缓存区剩余大小(即当前能接受的数据大小),左边界SND.UNA为接收方最新确认序号大小, 右边界为左边界加上窗口大小, SND.NXT则记录下次发送的数据序...

2019-01-16 21:42:11 793

原创 TCP传输控制协议(2)--TCP连接和终止

TCP的连接过程(三次握手)TCP的连接过程称为三次握手,其过程如下图,

2019-01-16 21:40:54 796

原创 lua和c/c++交互

lua 和c采用虚拟栈的方式传递数据,栈中的元素是以lua 数据结构的方式存储,

2019-05-05 10:51:54 1403

原创 实现一个简单的shell

#include <unistd.h>#include <string>#include <errno.h>#include <string.h>#include <vector>#include <iostream>#include <sys/types.h>#include <sys

2019-03-01 21:44:05 372

原创 Linux文件权限

通过ll命令查看文件的属性,主要分四部分drwxr-xr-x第一位为文件的类型,其中d 表示文件目录,-表示普通文件,l表示软链接文件(关于软硬链接后面说),b表示块设备,p表示管道文件,c表示字符文件然后剩余9位分为三组,文件所属用户权限,文件所属组权限,其他用户权限,其中w表示可写,r表示可读,x表示可运行。对于目录来说,w表示具有可删除、移动目录的权限,x 表示具有可以进入目录的...

2019-02-27 16:10:20 386

原创 模板

模板是泛型编程的基础,通过模板可以编写与类型无关的代码,可以提高代码复用模板分为函数模板和类模板函数模板相当于一个函数族,编写一个函数模板,然后编译器根据这个模板对不同的参数类型生成不同的函数,另外一种是类模板,其类成员是模板类型,在调用时通过,显示调用的方法实例化该类型模板分为非类型模板参数,和类型模板参数类型模板参数就是在传递时需要传递一个类型,而非类型模板参数就是在模板参数中可以出...

2019-02-25 15:10:55 208

原创 C++智能指针

为什么需要智能指针首先是因为传统裸指针容易造成内存泄露问题,另外还有在使用异常时,如果在申请空间和释放空间之间抛异常,并且没在该函数处理,会造成内存泄露。因为这些原因引入了智能指针智能指针原理智能指针是使用了RAII的思想RAII(Resource Acquisition is Initialization)直译为资源获取即初始化,即其在构造函数中获取资源,在析构函数中释放资源,因为C++...

2019-02-24 20:39:26 438

原创 站内搜索引擎

搜索引擎目标:实现搜索boost库文档实现实现查找 倒排索引’正排索引:给定编号,获取到文档的内容倒排索引:给定一个词,能获取到这个词和那些文档编号相关搜索引擎组织结构数据处理模块:对待搜索的网页进行预处理(html转文本)索引模块:根据数据处理模块的结果作为索引模块的输入,构建正排索引和倒排索引搜索模块:根据用户输入的查询次,对索引进行查找,最终找到相关文档分词:对查询进行...

2019-02-23 17:59:52 1207

原创 C++虚继承

虚继承是为了解决菱形继承问题,菱形继承会产生数据冗余,并且容易产生二义性一个菱形继承的例子class A{public: int _a;};// class B : public Aclass B : public A{public: int _b;};// class C : public Aclass C : public A{public: int _c;...

2019-02-17 19:52:47 297

原创 C++多态

多态多态即多种状态,在面向对象语言中,接口的多种不同的实现方式即为多态,多态分为两种一种为静态多态,一种为动态多态,静态多态是通过函数重载实现的,在程序链接期间已经绑定,动态多态是通过虚函数实现,在程序运行期间通过调用的对象决定执行的函数。虚函数虚函数是通过virtual定义的要实现多态必须重写虚函数,重写是指在基类中有一个和子类返回值、函数名、参数相同的虚函数,子类的虚函数可以重写基类虚...

2019-02-17 17:42:46 189

原创 C和C++区别和联系

C++在最初的设计初衷要求兼容C语言,所以C++支持支持c的基本语法,C语言是面向过程的程序设计语言,其注重的是数据结构和算法的设计,即给问题然后分析解决问题的思路,通过函数将分析的步骤实现,而C++兼容C语言其也支持这种设计方式,另外C++支持面向对象程序设计,和泛型程序设计风格,面向对象注重的不再是一个一个步骤,而是对象在整个问题处理中的行为,每个对象有自己的属性,和自己处理的方法,这是C和C...

2019-02-16 21:05:05 368

原创 MySQL事务管理

事务是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体事务基本操作开始事务 start transaction结束事务 commit 提交事务 或 rollback 回滚到事务开始保存点 savepoint pointName回到保存点 rollback to pointName事务操作注意事项如果没有设置保存点,也可以回...

2019-02-15 20:28:46 252

原创 MySQL索引

索引是为了提高数据库的查询性能,提高效率特别高,其会降低插入效率不过相比查询提高的效率这些是值得的。索引的类型:主键索引(primary key)唯一索引(unique)普通索引(index)全文索引(fulltext)需要注意的是不同的存储引擎对索引的支持不一样,在旧的版本InnoDB不支持全文索引,全文索引只有MyISAM支持,不过新版的MySQL5.6.24上InnoDB引擎...

2019-02-15 19:07:58 170

原创 MySQL数据库的基本操作

在MySQL中可以使用help命令查看操作命令的使用。下面使用一些示例记录操作,具体使用通过文档查看创建数据库创建名为db1的数据库--IN NOT EXISTS不存在就建库,存在就忽略CREATE DATABASE IN NOT EXISTS db1;另外在创建数据库时可以设置字符集和校验规则CREATE DATABASE IN NOT EXISTS db2 charset=ut...

2019-02-13 18:04:32 252

原创 IO多路复用--epoll

epoll首先解释下为什么会有epoll,前面我们看了poll和select因为监听事件的增加会导致效率下降比较严重此时当处理大量IO时间时就需要一种效率比较高的处理模式,而epoll就是为了处理大批量句柄设计的IO多路复用模型。...

2019-01-21 18:17:59 438

原创 IO多路复用--select/poll

IO多路复用是一种同步IO模型,在IO操作中,阻塞IO在等待IO操作时如果不满足条件会阻塞挂起,导致一个线程在同一时间只能处理一个IO,而非阻塞方式在进行轮训操作时,当有多个IO需要同时监听时,处理就会很麻烦。IO多路复用同一时间多个不同的IO操作,调用线程在调用时阻塞等待,当有任意监听的IO操作时就会返回。select模型采用Reactor模式实现用户线程Reactor内核注册时间处理器s...

2019-01-20 20:35:23 436

原创 5种IO模型

阻塞IO很常见的一种IO模型,即在进行IO操作时该进程或者线程阻塞挂起,等待IO操作完成返回结果如套接字、管道等默认均为阻塞IO,一个文件描述符, 默认都是阻塞IO。非阻塞IO非阻塞IO 即在调用时,如果不满足条件,如管道现在为空(前提是管道的写端没有关闭,否则阻塞和非阻塞在管道为空时去读均会返回0)或者接受缓存区为空时不会阻塞,直接返回并且设置错误码为EWOULDBLOCK改变文件描...

2019-01-20 20:34:27 184

原创 Git使用

git创建版本仓库git init创建一个文件夹或者使用一个已经存在的文件,在文件内运行git initgit仓库添加文件添加文件, 可以多次添加之后然后再提交,在git add后可以通过git status查看添加的信息git add [需要添加的文件] //git add test.c//如要添加整个文件夹呢内容可以使用 git add .//.表示当前文件路径托...

2019-01-18 21:42:45 623

原创 二维数组中的查找

题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路第一种,刚开始用了二分查找,即在每一行用二分查找查看是否存在,算法复杂度为O(N*logN)bool Find(int target, vector<vector<int&...

2019-01-17 17:34:10 167

原创 TCP传输控制协议(1)--TCP首部格式

TCP传输控制协议TCP协议是面向连接的可靠传输协议,传输是面向字节流的即,不对数据边界进行控制,需要上层对交付给TCP的数据控制边界,否则会发生粘包问题。面向字节流的数据传输,会对数据进行一定的拆分或者组装。接收方接受数据灵活可以接受单个字节或多个字节(应用层)。TCP协议是面向连接的,因此在数据的传输之前需要建立连接,数据传输完成后需要终止连接TCP协议是一种可靠传输协议。TCP首部格...

2019-01-16 21:39:20 248

原创 Linux线程(3)--线程池

线程池线程池是一种对线程进行管理的一种机制,其线程创建释放和获取任务均由线程池来完成,如果一个应用需要频繁的创建线程处理任务,如果不对线程加以现存限制,当任务爆发时可能会因为内存不足造成瘫痪,另外线程的创建和释放需要成本,线程数量增多后线程的调度也会变慢。因此当每个线程处理时间特别段或者需要对线程的数量加以限制时可以使用线程池。在这实现一个简单的固定数量的线程加任务队列的一个线程池...

2018-12-24 19:33:05 615

原创 Linux线程(2)--线程同步与互斥

同步与互斥同步:同步是不同任务之间的直接制约关系,是具有顺序性的执行,比如两个进程B依赖A执行完的数据, 因此只有执行了A才能执行B,其规定的是执行次序。互斥:互斥是访问临界区的唯一性,是一种间接制约关系,同一时间只能有一个任务执行。比如在某一时刻只能有一个进程或者线程对一个文件进行写入。临界区是访问临界资源的代码,临界资源是同一时间只能有一个任务访问的资源。这个任务可以是进程也可以是线程。...

2018-12-22 19:22:29 718

原创 Linux线程(1)--线程概念

线程在这先解释下进程,进程是一个执行的实体,包括其需要执行的程序,以及其活动过程是一个动态的过程,可以讲进程是一个“执行中的程序”,从操作系统角度进程是资源分配和一个独立单位,操作系统在分配CPU、内存、时间片等资源时是以进程为基本单位的。在Linux下没有真正的用户线程,真正的用户线程是建立在用户空间,其对内核是透明的,因此其所属进程单独参与处理器的竞争,而进程的所有线程参与竞争该进程的资源...

2018-12-22 11:10:51 338

原创 简单UDP网络程序

UDP服务端#include <unistd.h>#include <string.h>#include <errno.h>#include <stdlib.h>#include <arpa/inet.h>#include <stdio.h>#include <sys/types.h>#includ

2018-12-03 17:02:18 219

原创 socket套接字及相关函数介绍

套接字套接字是通信端点的一个抽象,套接字描述符类似文件描述符,在i

2018-11-30 13:39:13 1638

原创 UDP协议

UDP协议(用户数据报协议)UDP是面向数据报的传输层协议,即用户进程将数据包交给传输层 UDP在构建UDP数据报时,不会进行划分,或者进行添加,其会原样发送(在传输层)到对方主机也需要整体接受,而面相字节流(TCP采用这种方式)是如果传输的字节较长,会将数据进行分段,如果数据较短会将多个数据包进行合并然后构成报文段进行发送,这种方式收发比较灵活,对端可以分多次进行读取,也可以一次读取不过这也造...

2018-11-27 20:14:25 528

原创 IP协议(2)--协议格式和IP分片

IP协议IP协议工作在网络层,是TCP/IP协议族中一个重要协议,其主要负责数据的传输即路由选择,

2018-11-25 17:38:05 1205

原创 IP协议(1)--IP地址

IP 地址分类这里的IP地址均指ipv4的地址IP地址采用点分十进制的表示方法有32位,如一个常见的IP地址192.168.1.1,其分为两部分 网络号 和主机号,当地址通过子网划分后主机号被分为子网号和主机号。在网络中的每一个网络接口需要在网络中通信就需要一个IP地址,在这里要想到每一个网络接口还有一个物理地址, 如在以太网下有MAC地址这也是唯一的地址,为什么需要一个IP地址,在这里有一...

2018-11-24 20:09:00 1220

原创 ARP协议

ARP协议ARP协议为地址解析协议,当局域网中以太主机需要将以太网桢发送到另一台主机时,其需要知道另一台主机接口的MAC地址,而上层只提供了IP 地址,这时就需要ARP协议进行IP地址和MAC地址的映射,并且ARP协议提供32位IP地址和数据链路层使用的任何地址的映射,这里只说IP和MAC地址的映射。ARP协议格式...

2018-11-24 12:16:54 772

原创 以太网协议

MAC

2018-11-23 15:38:52 7868

原创 TCP/IP四层模型简单介绍

OSI七层参考模型OSI(Open System Interconnection 开放系统互联)参考模型,是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。OSI分为七层应用层:为用户提供服务和协议表示层:设备固有数据格式和网络标准数据格式的转换会话层:通信的管理,负责建立和断开通信连接传输层:管理两个节点之间的数据传输,负责数据的可靠传输网络层:负责地址管理...

2018-11-21 17:23:55 8067

原创 进程间通信--共享内存

共享内存当一个程序想和另外一个程序通信的时候,那内存将会为这两个程序生成一块公共的内存区域。这块被两个进程分享的内存区域叫做共享内存共享内存是进程间通信最简单的一种,共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。通信的进程间共享同一块内存,进行操作时和访...

2018-11-17 20:23:17 769

原创 进程间通信--消息队列

消息队列消息队列提供了向另一个进程发送一个数据块的方法,每个数据块均具有类型消息队列是消息的链表,存放在内存中,由内核维护,其维护空消息队列,当进程需要传递消息时其申请空消息缓冲块填入数据,之后将消息块挂在另一个进程的消息队列上,当对方接收后会将此消息块从对方消息队列删除重新添加到空消息链表中。消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的...

2018-11-14 20:44:54 229

原创 进程间通信--命名管道

命名管道命名管道是一个存在于文件系统的一个特殊文件,命名管道和匿名管道区别:命名管道存在于

2018-11-14 16:55:05 329

原创 进程间通信--匿名管道

进程通信的目的数据传输:进程间需要数据的传输资源共享:两个或多个进程共享相同资源通知事件:当事件发生时需要通知另一个进程进程控制:一个进程需要控制另一个进程运行时,如调试程序进程间通信的方式管道:匿名管道和有名管道 system V IPC: system 共享内存,system 消息队列,system 信号量posix IPC:消息队列,共享内存,信号量,信号量集,条件变量...

2018-11-11 10:49:09 584

原创 Linux进程控制--进程替换

Linux进程替换使用fork创建的进程和父进程运行的相同的程序(执行不同的代码分支),子进程需要运行其他程序需要通过exec函数进行进程替换运行另一个程序。替换函数exec函数总共有六个int execl(const char *path, const char *arg, …);int execlp(const char *file, const char *arg, …);int...

2018-11-07 19:22:19 639

原创 Linux进程控制--进程退出和等待

Linux进程退出1. 进程退出的场景代码运行完毕正常退出,结果正确代码运行完毕正常退出,结果不正确异常退出2 .进程常见退出方式正常退出从main() 函数中返回return退出调用exit()函数退出调用_exit()函数退出异常退出由信号终止returnreturn是常见的进程退出方式,执行return等同于执行exit函数,main()函数中return ...

2018-11-03 21:44:45 3031

原创 Linux进程控制--进程创建

Linux进程创建‘linux下创建进程的方式有三种,通过fork vfork clone系统调用实现进程的创建1. fork()

2018-11-03 17:37:16 877

空空如也

空空如也

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

TA关注的人

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