- 博客(102)
- 收藏
- 关注

原创 TCP三次握手四次挥手【概念梳理】
TCP协议:传输控制协议,是一个有链接,可靠的,面向字节流的传输层协议。 TCP三次握手:1.怎么三次握手?从上面的两幅图中我们可以看出:第一次握手:SYN = 1, seq = x 客户端发送一个TCP的SYN标准位为1的包,知名客户端打算连接的服务器的端口(请求同步),并选择序号seq = x 表明传送数据时的第一个数据字节 的序号是x。seq是随机值。...
2018-07-31 15:52:32
423
原创 java基础知识整理
前世java的历史来源背景背景在网上百度随便都能找的到就不细说了,作为一个之前学习C++的程序员来说,学习java尽量对比学习,理解可以更加透彻。学习角度:java相对C++摒弃了哪些特性,又增加了哪些特性?java的包、jdk、jar包、jre包(package)package 特点1.程序中如果有package语句,该语句一定是源文件中的第一条可执行语句;2.package语句...
2019-08-28 09:45:37
348
原创 五种IO模型
高级IO模型共有五种:阻塞IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方式。 非阻塞IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK错误码 ----- 非阻塞IO一般需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为轮询. 这对CPU来说是较大的浪费, 一般只有特定场景下才使用。 信号驱动I...
2018-08-21 15:36:52
3065
原创 基于ICMP协议的ping命令
要模拟实现ping命令,就需要对ICMP协议有所了解:ICMP:Internet控制报文协议,它是TCP/IP协议族中的一个子协议,用于在IP主机,路由之间传递信息的协议。传输的信息包括:1.目的不可达消息2.超时消息3.重定向消息4.时间戳请求和时间戳响应消息5.回显请求和回显响应消息。ping命令 的机制就是回显请求和回显应答消息,具体是向网络上另一个主机上发送...
2018-08-07 14:43:06
11870
1
原创 TCP的分段和IP的分片
今天被同学问到一个问题: TCP的分段和IP的分片有什么联系?先介绍两个概念:MSS:(Maxitum Segment Size)最大分段大小的缩写,是TCP协议里面的一个概念 MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小2...
2018-08-07 13:41:00
452
原创 关于RTT、TTL、MSL的概念解释
1、 MSL 是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为tcp报文 (segment)是ip数据报(datagram)的数据部分,具体称谓请参见《数据在网络各层中的称呼》一文; 2、ip头中有一个TTL域,TTL是 time to live的缩写,中文可以译为“...
2018-07-31 16:10:42
2638
1
原创 基于socket套接字的UDP/TCP服务器【网络编程】
基于socket套接字基本函数,我们就可以实现一些简单的回显服务器,及基于UDP/TCP的服务器和客户端。UDP回显服务器:简单思路:1.socket()创建socket套接口2.bind() 绑定IP地址端口号3.循环的从连接端口接收数据,并重新写入//////////////////////////////////////////////// 服务器:// 1.启...
2018-07-30 11:55:05
276
原创 网络编程套接字【socket】
在学习Linux系统编程的时候,进程间的通信方式包括——管道、消息队列、共享内存、信号量等方式。但是这些通信方式都村子一定的缺陷——都是在同一个机器上的进程间的通信。为了让不同机器上的进程之间相互通信,Linux网络编程便可解决。linux系统支持套接字接口,可以通过与使用管道类似的方法来使用套接字,但套接字还包含了计算机网络的通信。Linux网络编程---套接字。套接字(socket)是...
2018-07-29 21:31:58
1051
原创 STL——STL六大组件概念
STL(standard template libaray ):标准模板库,是C++程序设计语言的标准程序库,是一个包罗算法与数据结构的软件框架。STL的目的是标准化组件,所以在STL中使用了泛型编程的思想,对我们常用的数据结构:顺序表、链表、树、哈希以及常用的查找、排序等算法使用模板进行了封装,而且从运行效率以及内存使用上都基本达到了最优。引入STL后,再也不需要我们重新造轮子,而且写出来的代码...
2018-06-19 17:03:34
702
原创 C++智能指针
在C语言学习的时候,指针的功能虽然强大,但是也是十分危险,指针的释放和置空在C语言中十分重要,不正确的操作可能会导致内存泄露。那能否让程序自己去控制在不需要资源时自动将其归还给系统。RAII (Resource Acquisition IsInitialization) :定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放...
2018-06-07 16:58:00
181
原创 Linux的查找命令
Linux常用的查找命令有:find、which、 whereis、 locate、 type.1.find : 查找任何文件格式:find [PATH] [option] [action]参数说明: 时间查找参数: -atime n: 将n*24小时内access过的文件列出来 -ctime n: 将n*24小时内状态发生改变的文件列出来 ...
2018-05-31 16:36:31
419
原创 C++的异常机制
在学习C语言时我们的程序出错的处理方式基本都是以下几种:1.终止程序 (除数为0)2.返回一个表示错误的值,附加错误码(errno)3.返回一个合法的值,让程序处于一种非法的状态(atoi())4.调用预先准备好的错误处理函数 (回调函数)5.直接终止程序: abort 或者 exit().6.setjmp() 和 longjmp() 函数组合。C语言的常见处理方式之一:输...
2018-05-29 10:46:20
759
原创 C++模板封装Vector和带头结点的双向链表
C++模板封装Vector:注意:1.在Vector的拷贝构造,扩容函数中,需要注意string的影响#pragma once #include <iostream>#include <assert.h>#include <string.h>#include <string>using namespace std;template&...
2018-05-28 16:44:30
539
原创 mmap函数
写在前面:内存共享的几种方式:管道:简单、数据量较小共享内存:最快mmap:最高效socket:最稳定这篇文章重点分析一下mmap:void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *addr,...
2018-05-20 20:40:48
538
原创 Linux信号
信号的概念:信号是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或者系统异常。信号的产生:1>对于前台进程,用户可以通过输入特殊的终端字符来给它发送信号。如输入Ctrl+c向进程发送一个中断信号。2>系统异常。如浮点数异常和非法的内存段的访问3>系统状态变化。如alarm定时器到期将一起SIGALRM信号。4>运行kill命令或者调用kill函数。服...
2018-05-15 20:33:27
736
原创 Linux下的简单线程池
问题描述:在我们的日常生活中,如果我们现在要浏览一个网页或者频繁的打开一个执行时间较短的任务,如果每次调用都创建一个线程,使用结束后就立即释放,那么这样的开销对于操作系统来说有点太过浪费了。而线程池的出现就可以很好地解决这样的问题。线程池:1.特点:1>经典生产者消费者模型。2>线程池中有若干等待的线程。3>线程池中的线程用于执行大量的相对...
2018-05-12 12:32:42
1795
2
原创 在虚拟机中和本地上传和下载文件
说明:我的虚拟机系统是Centeros7, 本地系统是Win7,工具是Xshell。希望能帮到大家。虚拟机下载文件到本地:1.找到要下载的文件或文件夹,pwd查看当前的绝对路径2.将文件夹打包 (单个文件可以忽略这一步) tar -zcvf /home/czf/Test/test.tar.gz czf ddd eee 格式为 : tar -zcvf /全路径名/生成的打包文件名 要打包...
2018-05-07 15:35:39
12124
原创 线程的几种锁及基本操作
互斥锁:1.定义互斥量: pthread_mutex_t mutex;2.初始化互斥量: pthread_mutex_init(&mutex, NULL); //第二个参数不研究置NULL; //初始化为 1 (仅做记忆)3.上锁 pthread_mutex_lock(&mutex); 1->0; 0 等待4.解锁
2018-05-05 22:50:21
37778
2
原创 线程的基本概念
线程:1>在一个程序里的一个执行路线叫做线程,线程是一个进程内部的控制序列2>一个进程至少都有一个执行线程线程和进程创建过程简单图示:线程和进程:进程是资源竞争的基本单位线程是程序执行的最小单位一个进程内的全部进程共享同一个全局内存空间,这使得进程间很容易共享信息,但是这种容易性也带来可同步问题。一个进程内的线程不光共享全局变量,以下信息也是它们所共享的:1.进程指令2.同一地址空间,...
2018-05-05 22:49:50
319
原创 实现哲学家问题和生产者消费者模型
利用信号量实现互斥访问资源:#include <stdio.h>#include <stdlib.h>#include <sys/ipc.h>#include <sys/sem.h>//本例描述互斥的打印字符AAZZ必须成对出现union semun{ int val;};int id;void print(char...
2018-05-02 00:26:13
223
原创 进程间通信之SystemV IPC--共享内存和信号量
共享内存:最快的可用IPC形式,一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传输就不再涉及内核。然而往该共享内存区存放信息或从中取走信息的进程间通常需要某种形式的同步。(不涉及内核:进程不是通过执行任何进入内核的系统调用来传递彼此的数据)。在消息队列处实现过一个服务器和客户机通信的例子:简单的客户端---服务器例程下图展示了从服务器到客户机的文件数据流向:当我们使用共享内存区对对...
2018-05-02 00:09:23
257
原创 进程间通信之SystemV IPC--消息队列
System V IPC : 基于内核持续性System V 消息队列:在程序之间传递数据的一种方法System V 共享内存:用于在程序之间高效的共享数据System V 信号量:用于管理对资源的访问内核会为每个IPC对象维护一个数据结构:struct ipc_perm{ key_t key; /* 调用shmget()时给出的关键字...
2018-05-01 16:59:10
280
原创 实现一个不能被继承的类
在掌握了基本的继承关系时,为了加深理解和延伸知识,可以实现以下几个特殊的类:1.实现一个不能被继承的类:2.实现一个只能在栈上创建对象的类3.实现一个只能在堆上创建对象的类
2018-05-01 09:56:17
400
原创 虚表和虚基表的对象模型
继承这一块被虚表和虚基表弄的特别晕,专开一篇来研究研究:首先:虚表和虚基表无关系!!!虚函数:虚函数是在类的非静态成员函数前加virtual,则这个成员函数成为虚函数(并不是所有的成员函数能够定义为虚函数,如构造函数等),在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,实现多态性。虚表(虚函数表):C++中的虚函数的实现一般是通过虚函数表(Virtual Table)...
2018-04-26 11:23:15
812
4
原创 虚函数和多态
知识储备:重提切片行为:1.子类对象赋值给父类对象2.父类型的指针指向了子类对象3.父类型的引用引用子类的对象虚函数:类的成员函数前面加virtual关键字,则这个成员函数称为虚函数虚函数重写:当在子类的定义了一个与父类完全相同的虚函数时,则称子类的这个函数重写(也称覆盖)了父类的这个虚函数构成多态需要满足的条件:1.函数的形参是父类的指针或者引用2.调用的...
2018-04-25 21:59:38
232
原创 C++继承概念梳理
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。类的成员具有三种访问限定符:public protect(保护) private 基(父)类和派生(子)类之间继承关系也是三种: public protect private说明:...
2018-04-21 17:27:07
338
原创 进程间通信基本概念【操作系统】
基本概念:进程同步:(司机-售票员、生产者-消费者)两个或多个进程需要相互配合才能完成一项任务进程互斥:由于各个进程都要访问共享资源,而且这些资源需要排他使用,因此各个进程间需要竞争使用这些资源,这种关系就叫进程互斥进程间通信的目的:1.数据传递2.资源共享3.通知事件进程间通信的发展历史:1.管道2.SystemV3.POSIX(可移植操作系统接口)S
2018-04-17 00:07:37
602
原创 string类模拟之引用计数和写时拷贝
在 string类的模拟之深浅拷贝 中,我们可以看到,程序浅拷贝导致的崩溃,是因为多次释放内存引起的多次析构,那么我们可以添加一个计数器,这里称之为引用计数,来表示当前的空间有多少指针指向它,如果大于一的话,那么在调析构函数的时候,就只对引用计数减一,当减到只剩一的时候就可以安心的释放内存空间了。引用计数的本质就是一个整形变量,那么我们到底应该怎么给出引用计数的形式呢?1.整形成员变量(
2018-04-16 13:17:40
223
原创 string类的模拟之深浅拷贝
浅拷贝:浅拷贝只拷贝指针,但拷贝后两个指针指向同一个内存空间,或者可以说,原对象和拷贝对象共用一个实体,任何一个对象的改变都会引起另一个的改变。当类成员不包括指针何引用时,浅拷贝并无问题;但对于指针与引用成员,当对象的生命周期结束后,浅拷贝会造成同一块内存单元被释放两次,导致内存泄漏。深拷贝:不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针指向两个不同地址。调用拷贝构造函
2018-04-16 12:43:50
228
原创 浮点型数据在内存中的存储
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:1.(-1)^S*M*2^E2.(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。3.M表示有效数字,大于等于1,小于2。4.2^E表示指数位。
2018-04-13 14:06:32
473
原创 文件I/O流
1.FILE * fopen ( const char * filename, const char * mode ); 2.int fclose ( FILE * stream ); //需与fopen配套使用(打开流一定要关闭)3.int getc ( FILE * stream ); 4.int putc ( int character, FILE * stream );5.char * fgets ( char * str, int num, FILE * stream ); 6.int
2018-04-08 09:47:32
198
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人