自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 致敬科比,实现查询科比每赛季数据的Web服务器

前言:我从2007-2008赛季,加索尔来湖人之后,湖人三进总决赛的第一个赛季开始喜欢科比,那时候我五年级,现在十年过去了,我大三了,科比已经退役两年了。 我目前的技能足以支持我实现一个简单的关于科比的Web服务器,这是我两前,2016-4-14日(科比最后一场比赛)结束以后,就想完成的事情。使用技术 网络编程 多线程 cgi机制 shell脚本开发环境 centos 6.5 ...

2018-08-09 16:59:50 3522 1

原创 庖丁解牛:剖析STL库空间配置器

在学习一个技术之前,知道为什么要学习它,学习它有什么用是必要的,所以我要先说明为什么需要空间配置器:内存碎片问题 假设依次向系统申请了16字节,8字节,16字节,4字节的空间,还剩下面的8字节空间未被分配; 随后,这两个16字节的空间被收回; (淡紫色部分表示已经被系统收回,粉色部分表示已申请,白色部分表示未被分配) 这时一共有16+16+8(淡紫色+白色)= 40字节空间,我要申...

2018-07-17 12:00:06 348

原创 驱动:学习Linux内核如何用宏来操作设备号

1.设备号,主设备号,次设备号**主设备号:**应用程序根据设备文件的主设备号,到这个内核的一个大数组中找到在内核中找到唯一驱动程序。**次设备号:**应用程序根据主设备号找到驱动程序,驱动根据次设备号找到对应的唯一的硬件外设。**设备号:**同时包含了主设备号和次设备号,它的数据类型为:dev_t(unsigned int)typedef __kernel_dev_t dev_t;t...

2019-06-13 20:08:59 364

转载 Telnet和SSH(ssh1,ssh2)间区别

一、TELNET使用Telnet这个用来访问远程计算机的TCP/IP协议以控制你的网络设备相当于在离开某个建筑时大喊你的用户名和口令。很快会有人进行监听,并且他们会利用你安全意识的缺乏。传统的网络服务程序如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容...

2019-03-21 10:38:41 782

翻译 文件I/O

五个主要的函数:open read write close lseek一:文件描述符对于操作系统内核来说,所有打开的文件都通过文件描述符引用;文件描述符(fd)是非负整数;0:标准输入 STDIN_FILENO1:标准输出 STDOUT_FILENO2:标准错误 STDERR_FILENO(一个进程默认打开三个文件,分别是上面这三个,为了提高可读性,应该使用后面的形式)二:open ...

2019-03-18 15:22:14 343

原创 红黑树旋转的通俗易懂版本以及判断一个树是否为红黑树

红黑树属于二叉搜索树,但是每个节点增加了一个存颜色的位,它的规则是:1.根节点为黑色。2.不能有连续的两个红节点,所以如果一个节点的颜色为红,那么它的子节点若不为空则一定为红。3.每条路径上黑节点数量相同。所以保证了最长路径不超过最短路径的两倍,没有AVL树那么严格的平衡,但是旋转少效率高,也是O(LgN)。判断一棵树是否为红黑树: bool IsRB() { if (_r...

2018-09-23 10:15:41 1659

原创 AVL树的C++代码实现,如何旋转,判断是否为AVL树

我们知道,二叉搜索树的搜索时间复杂度为O(LgN),但是当插入的K值为有序时,如插入1,2,3,4,5,6…,搜索的时间复杂度又会变为O(N),因为此时的二叉搜索树以及差不多是一个单链表了,如图:所以为了解决这样尴尬的局面,出现了AVL树,源代码如下:template <class K,class V>struct AVLNode{ K _key; V _value; i...

2018-09-22 17:57:40 1143

原创 二叉搜索树的C++代码实现

template<class K,class V>struct BinaryNode{ K _key; V _value; BinaryNode<K,V>* _left; BinaryNode<K,V>* _right; BinaryNode(const K& key,const V& value) :_key(key), _v...

2018-09-22 17:49:40 892

原创 进程地址空间布局

创建一个进程时,操作系统会为该进程分配一个 4GB 大小的进程地址空间,本文具体讲的是进程地址空间的各个部分:栈:存放程序临时创建的局部变量,也就是代码块之内或者函数之内的变量,但不包括static修饰的(static修饰的变量放在数据段);还存放函数参数和返回值等。堆存放动态分配的内存段,比如malloc与new出来的空间。栈和堆相向而生,栈从高地址到低地址,堆从低地址到高地址。B...

2018-09-22 09:13:14 592

原创 模拟实现atoi函数

int atoi(const char* ptr) ; 1.跳过前面的空白字符(例如空格,tab缩进)等,可以通过isspace( )函数来检测; 2.遇上数字或正负符号才开始转换,而在遇到非数字或’\0’才结束转换,并将结果返回。 3.如果 ptr不能转换成 int 或者 ptr为空字符串,那么将返回 0。 4.该函数要求被转换的字符串是按十进制数理解的。ok,知道这些了,实现它就不...

2018-08-20 15:46:57 294

原创 简单介绍C++强制类型转换

在介绍C++强制类型转换之前,我们先来看一看C语言风格的强制类型转换,的确,C风格的强制类型转换用起来很方便。 它的格式是: (类型)变量void test_c_cast(){ //隐式类型转换(相近类型) int i = 1; double d = i; //强转 int* p = &i; int address = (in...

2018-08-20 10:31:02 300

原创 探索类型萃取的必要性

首先我们来实现一个能装string的容器,只实现了尾插和打印接口。template <class T>class SeqList{public: SeqList() :_a(NULL), _size(0), _capacity(0) {} void PushBack(const T& x) { if (_...

2018-08-16 16:04:04 301

原创 C++对象模型图示总结

本文的图片全部是由我自己所画,如有错误,感谢大家指出。菱形继承和菱形虚拟继承 有虚函数的类对象 有虚函数的单继承 有虚函数的多继承 有虚函数的菱形继承 有虚函数的菱形虚拟继承 ...

2018-08-16 09:31:43 626

原创 C++:为什么在继承关系中,父类的析构函数最好定义为虚函数?

我们先来看一段简单代码,A类有一个指针成员_pa,B类公有继承了A类,然后自己有一个指针成员_pb:class A{public: A(int x = 1) :_pa(new int(x)) {} ~A() { cout << "~A()" << endl; }protected: i...

2018-08-15 15:14:33 6236 4

原创 C++:重载,重定义,重写的区别

这是比较容易混淆的概念,在此整理,以便理解。一:重载 重载指的是在同一个作用域内,两函数的函数名可以相同,但是参数不能完全相同,可以是参数类型不同或者是参数个数不同,至于返回值,不影响重载。如图,构成了重载: 如何实现重载? C++代码在编译时会根据参数列表对函数进行重命名,例如void Test(int a, int b)会被重命名为_Test_int_int,void Tes...

2018-08-15 14:44:31 20679 8

原创 C++写时拷贝

一:浅拷贝 一个类,如果不写拷贝构造函数,那么它的默认拷贝构造函数为浅拷贝,浅拷贝有什么问题呢? 拿一个简单的String类举例:class String{public: String(char* str = "\0") :_str(new char[strlen(str)+1]) { strcpy(_str, str); } ...

2018-08-14 19:57:14 1643

原创 模拟实现C++的new/delete

本文只讨论关于自定义类型的new/delete。模拟实现new:template<class T>T* New(size_t n){ //先开辟一段空间,要多开4字节,用来存放开了多少个对象 T* ptr = (T*)operator new(sizeof(T)*n+4); *((int*)ptr) = n; //ptr向后移4字节,开始给...

2018-08-13 15:19:24 304 1

原创 C++中const关键字

一:const修饰指针变量int num = 0;1.const在 * 前面,表示const修饰指针指向的内容const int* p = #int const* p = #2.const在 * 后面,表示const修饰指针变量int* const p = #二:const修饰成员函数 首先来看一下普通成员函数:cla...

2018-08-13 11:20:53 177

原创 C语言static关键字的作用

一:当static修饰函数或者代码块之外的变量时 改变的是函数或全局变量的链接属性,外部链接属性变为内部链接属性,而存储类型和作用域不受影响。 换句话说,被static修饰的函数或全局变量,只能在当前源文件中访问。二:当static修饰代码块内部的局部变量时 在函数中定义局部变量,如果没有被声明为其他类型的变量都是自动变量,自动变量属于动态存储类型,函数调用结束后即被释放。 但有时候需...

2018-08-11 08:38:05 423

原创 宏和函数有什么区别?

define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏。 宏分为普通宏定义和函数宏定义: 普通宏定义:#define MAX 1024 函数宏定义:#define MIN(a, b) ((a) < (b) ? (a) : (b))宏函数可以完成一些简单的运算,那么宏为什么不能取代函数呢?它们有什么区别?从代码长度来看: 宏每次使用都插入到程序中对应的位置...

2018-08-10 11:27:23 298

原创 一个C语言程序的编译过程

这是一个再简单不过的C语言程序:#include <stdio.h>int main(){ printf("hello world!\n"); return 0;}执行gcc test.c,就使一个源文件变成了可执行文件,这个步骤我们很熟悉,但是从一个源文件(.c文件)到可执行程序到底经历了哪几步,每一步具体做了什么,这是我想要总结一下的:一:...

2018-08-10 11:01:48 2411

原创 如何建立Windows和Linux之间的共享文件夹

以win10和centos为例:第一步,点击虚拟机,设置: 第二步,点击选项: 第三部,点击共享文件夹,点击总是启用,然后点击添加: 第四步,添加共享文件夹: 添加成功之后,在 /mnt/hgfs 目录下,就会有共享文件夹。 ...

2018-08-10 07:20:24 9667 3

原创 总结指针和引用的区别

一:什么是引用 引用就是给一个已经定义的变量起一个别名,并没有定义新的变量; 引用的格式为:类型& 引用变量名 = 已定义过的变量名; int a = 1; int& b = a; cout << &a << endl; cout << &b

2018-08-07 19:23:50 239

原创 详细解读域名解析(DNS)

DNS是一个从域名映射到IP地址的系统。一:DNS的背景 TCP/IP使用IP地址和端口号来瞄准对应网络上一台主机的一个进程,但是IP地址不好记; 于是有了主机名(字符串),并且使用hosts文件来描述主机名和IP地址的关系。 如图: 最初是互联网信息中心来管理这个hosts文件,如果一个计算机想接入网络,或想变更IP,都需要到信息中心申请,其他计算机也要定期更新hosts文件才能...

2018-08-03 16:07:25 3531

原创 总结数据链路层

上一篇文章说到:网络层实现的是直至目的地址(主机A到主机B)的通信,而具体的实现某一个跳转的通信,是由数据链路层实现的,如图: 具体附链接: https://blog.csdn.net/han8040laixin/article/details/81354588数据链路层的作用:用于两个设备(同一种数据链路节点)之间进行传递。一:简单了解以太网 以太网不是一种具体的网络,而是一种...

2018-08-03 14:01:12 600

原创 总结网络层IP协议

本文主要讨论IP协议及相关内容,如有错误,感谢大佬指正!基本概念: 主机:有ip地址但不进行路由控制的设备 路由器:既有ip地址又能进行路由控制 节点:主机和路由器的统称IP协议: 提供了一种能力,将数据报从A主机发送至B主机,但是不一定能发送到,可靠性是由上层的TCP保证的。IP协议格式 4位版本:指定IP协议的版本,ipv4来说,就是4。 4位首部长度:IP头部有多...

2018-08-02 11:56:41 399

原创 什么是子网掩码?怎么根据子网掩码得到网络号?

在学习子网掩码之前,必须搞懂网段划分互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。IP地址分为两部分: 网络号:保证相互连接的两个网段具有不同的标识。 主机号:同一网段内,主机之间虽然具有相同的网络号,但是必须有不同的主机号,这样才能找得到。如图所以,网段不同则必须配置不同的网络号,同一网段内的主机网络号相同但是主机号不同:IP地址为一...

2018-08-01 11:49:41 11638 4

原创 详细解读传输层UDP,TCP协议

首先应该明确一个思路: 在TCP/IP协议中,用 源IP,源端口号,目的IP,目的端口号,协议号 这样一个五元组来标识一个网络通信(通过netstat -n查看)那么传输层如何把有效载荷交给应用层? 1.将报头和有效载荷分离; 2.有效载荷通过某种方式交到上层(报头中必定有源端口号和目的端口号)一.UDP协议UDP协议格式 UDP协议采用定长报头(8字节),将报头和有效载荷...

2018-07-31 12:20:45 610

原创 TCP连接管理机制

本文主要涉及到TCP的连接机制及其过程详解,TIME_WAIT状态详解,以及为什么需要三次握手和四次挥手,如果有错误,感谢大佬们指正。一:TCP连接管理机制 服务器状态转化: 1.CLOSED -> LISTEN:服务器创建监听套接字后进入LISTEN状态,等待客户端建立连接; 2.LISTEN -> SYN_RCVD:当监听到连接请求(SYN),就将该连接放入内核等待队...

2018-07-30 14:07:22 2236 1

原创 Linux下通过Shell脚本快速进入指定目录

现在有一个现实的场景: 每一次打开Linux,都是在 目录下;我最近想练习网络的代码,所以创建了一个目录,路径为: 可以看到,这个路径很长,如果没一次都通过cd /home/admin/linex/internet/practice,那太麻烦了!那么如果应用到Shell脚本,把这个指令写入脚本,再执行它不就可以了吗? 试一试就知道了,见名知意,我把该脚本命名为goto.sh: ...

2018-07-29 10:19:02 35026

原创 网络编程套接字

之前说了多路转接,那么今天我来谈谈我对网络编程套接字的理解。初识ip地址和端口号 ip地址 ip地址有两个版本:ipv4和ipv6,我在这里介绍ipv4: 1.ip地址是在ip协议中,用来标识网络中不同主机的地址,它分为两部分: 2.对于ipv4来说,ip地址是一个4字节32位的整数; 3.人们通常用点分十进制的字符串表示ip地址,比如127.0.0.1(每一个用点分隔的数字代表...

2018-07-27 17:05:02 290

原创 I/O多路转接之epoll

按照man手册的说法:是为了处理大批量句柄而作了改进的poll。 这句话对我而言,说和不说没什么区别,太抽象了,所以要弄清楚什么是epoll,还是要从底层剖析!epoll的三个相关系统调用一:epoll_create:创建一个epoll模型(也是文件) 参数解释: size:指定生成文件描述符的最大范围。返回值解释: 返回一个文件描述符,该fd标识创建的epoll模型。...

2018-07-27 10:59:32 352

原创 非阻塞IO

文件描述符默认都是阻塞的IO 那么如何把一个fd设为非阻塞呢?需要用到fcntl函数:参数解释: ①fd:需要操作的文件描述符 ②根据cmd值得不同,决定后面追加的参数。 fcntl函数共有以下五种功能,分别对应五个cmd的值: 可以利用第三种功能,获取/设置文件状态标记,就可以将一个fd设为非阻塞,具体操作见代码:#include <stdio.h>#...

2018-07-27 10:25:59 226

原创 I/O多路转接之poll

2018-07-26 08:16:55 213

原创 面试题:在字符串中找出连续最长的数字串

题目要求: 在字符串中找出连续最长的数字串,并把这个串的长度返回;函数原型: unsigned int Continumax(char** pOutputstr, char* intputstr);后者是输入字符串,前者是输出的连续最长的数字串。 如果连续最长的数字串的长度为0,应该返回空字符串,而非NULL。  思路:遍历字符串,遇到数字后就开始循环,直到遇到的不是数字后才跳出循...

2018-07-25 18:40:05 4088

原创 I/O多路转接之select

一:什么是多路转接?什么是select? 简单来说,select只做一件事,那就是等,等至少一个文件描述符的读写时间就绪。具体来讲,系统提供select来实现多路复用输入/输出模型: select系统调用可以让程序监视多个文件描述符的状态变化; 程序会在select这里等待,直到被监视的文件描述符至少有一个发生了状态改变。select函数声明 参数解释: ① nfds:被监...

2018-07-22 14:55:59 197

原创 初识Shell脚本

说起Shell,我们并不陌生,但很多人又不能很准确的说出Shell到底是什么,所以准确认识Shell的定位,是很有必要的。一:Shell的初识 Shell的定位: Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁,是一种与内核交流的外壳应用程序的统称。 这个应用程序提供了一个界面,用户通过该界面与操作系统内核交流。 Shell既是一种命令语言,又是一种编程语言。Sh...

2018-07-21 11:28:41 1614

原创 剑指offer:复杂链表的复制

所谓复杂链表,指的是:    每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点(可以指向自己,可以为空)。结构如下:struct RandomListNode{ RandomListNode(int x) :label(x) , next(NULL) , random(NULL) {} int label;//节点的值 struct Ra...

2018-06-05 10:36:00 166

原创 面试题(剑指offer):顺时针打印矩阵

题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.如图所示:实际上,就是每一次打印一圈:第一圈的左上角为(0,0),第二圈的左上角为(1,1),……,第n圈的左上角为(n-1,n-1...

2018-05-30 18:05:06 1712

原创 c语言:如何将字符串转为整数?

题目:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空。输出描述:如果是合法的数值表达则返回该数字,否则返回0例如:输入:+2147483647 1a33输出: 2147483647 0一个整数,要么正,要么负,所以需要先判断字符串的第一个字符是否为'+'或'-',如果是...

2018-05-24 19:36:36 16322

空空如也

空空如也

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

TA关注的人

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