7层通信 在七层osi模型中是如何实现通信的呢。参考上图。 首先,发送方从第七层(应用层)到第一层由上至下发送数据,而接收端刚好相反从下至上接收数据。发送端再处理上一层传过来的数据时可以附上当前分层的协议所必须的“首部”信息。接收端对收到的数据进行数据“首部”与“内容”的分离,再转发给上一层,并最终将发送端的数据恢复为原状。 应用层 假设A要给B发送一个邮件,发送的邮件分为两部分,一部分是内容,另一部分是收件人。内容是与通信无关的内容,而将内容发送给B则是与通信有关的内容。 从用户输入完成要发送的内容并“点击”发送按钮的那一刻开始,就进入了应用层协议的处理。该协议会在所要传送的数据的前端附加一个首部(标签)信息。该首部标签表明了“内容”和“收件人B”。当接收端的应用层处理是,会获取内容,并且得知该邮件是A发给我的,并且将邮件内容保存的硬盘中。如果无法写入硬盘,则会返回一个错误给发送方。这就是应用层的作用。 表示层 在我们的生活中,应用的软件不同也会导致数据的表现形式不同。例如有字处理的软件只能由该字处 继续阅读 >>


朱文博 18/12/24 12:22:01
使用empalce操作 新标准中加入了三个新成员——emplace、emplace_front、emplace_back。这些是操作构造,而不是拷贝构造。 这些操作分别对应以前的insert、push_front、push_back。允许我们将元素放置在一个指定位置之前或容器头部或容器尾部。 当调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们调用一个emplace成员函数时,则是将参数传递给元素类型的构造函数。emplace成员使用这些参数在容器管理的内存空间中直接构造元素。 我们看一个例子: 来源:原文链接 #include <vector> #include <string> #include <iostream> struct President { std::string name; std::string country; int year; 继续阅读 >>


朱文博 18/12/02 19:23:06
堆排序 本篇博客假定读者已经掌握了完全二叉树和二叉堆的概念。 1.概念 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。 误区 当我们学完二叉堆的时候,掌握了建立最大堆和最小堆的思想,也掌握了删除堆的操作,我们这个时候就在想完全可以利用插入删除操作也可以实现对数组的排序。 首先我们将数组建立成一个最大或最小堆,再进行删除操作将值返回给数组也可以进行排序。 分析一下该算法的时间复杂度。首先建立一个最大或最小堆需要花费O(N)的时间,然后进行删除操作需要O(logN)的时间,我们要执行N次删除操作,所以整体就需要O(NlogN)的时间。 问题: 该算法的主要问题在于它使用了一个附加的数组。 继续阅读 >>


朱文博 18/09/28 11:10:53
dup 与dup2函数 Linux c 函数 #include<unistd.h> int dup(int fd); int dup2(int fd1,int fd2); 两个均为复制一个现存的文件的描述 两个函数的返回:若成功为新的文件描述,若出错为-1; 由dup返回的新文件描述符一定是当前可用文件描述中的最小数值。用dup2则可以用fd2参数指定新的描述符数值。如果fd2已经打开,则先关闭。若fd1=fd2,则dup2返回fd2,而不关闭它。通常使用这两个系统调用来重定向一个打开的文件描述符。 重定向 一般在程序实现重定向都会用到dup2函数。 文件描述符0 --> 标准输出 文件描述符1 -->标准输入 文件描述符2–>标准错误 例子1: #include<stdio.h> #include<stdlib.h> #include<fcntl.h> #include<unistd.h> #include<sys/ 继续阅读 >>


朱文博 18/09/03 18:00:25
Linux网络编程—多路复用之epoll epoll 是多路复用select和poll的加强版,epoll到底强在了哪些地方,我们接下来就会谈到。 我们先简单说一下select和poll的不足之处 select的缺点: 1、单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数量,但由于select采用轮询的方式扫描文件描述符,文件描述符数量越多,性能越差。 2、 内核 / 用户空间内存拷贝问题,select需要复制大量的句柄数据结构,产生巨大的开销。 3、select返回的是含有整个句柄的数组,应用程序需要遍历整个数组才能发现哪些句柄发生了事件。 4、select的触发方式是水平触发,应用程序如果没有完成对一个已经就绪的文件描述符进行IO操作,那么之后每次select调用还是会将这些文件描述符通知进程。 poll和select的用法非常相似,但是poll是使用链表保存文件描述符,因此没有了监视文件数量地限制,select的前三个缺点依然存在,在高并发下性能还是不够强大。 这 继续阅读 >>


朱文博 18/08/19 23:18:10
fork到底复制了父进程的哪些资源? 我们来看一个例子 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/wait.h> int main() { pid_t pid; int num = 5; int status; pid = fork(); switch(pid) { case -1: perror("create porcess is failed"); exit(-1); case 0: printf("child process num is:%d\n", num); exit(0); default: wait(&status); printf("parent process num is: %d\n", num); break; } return 0; } 运行结果如下: 继续阅读 >>


朱文博 18/08/12 15:45:41
进程 Linux是一个多用户多任务的操作系统。 1概念:进程,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。它的执行需要系统分配资源创建实体之后,才能进行。 举个例子: 我们所写的程序,在运行的时候它也是一个进程。 2进程和程序的区别: 程序相当于是一个文件,是有序代码的集合,是静态的存储在硬盘中。而进程是运行中的程序,系统会为变量分配相应的内存和初始化它们的值,还有一些资源如:堆,栈等…当程序运行完进程也就结束了,但程序还是保存在硬盘中没有消失 进程的特性 (1)并发性:可以与其它进程在宏观上同时向前推进(一会在下面讲解和并行性的区别)。 (2)动态性:进程是执行中程序,动态产生、动态消亡、动态变化。 (3)独立性:进程是系统资源分配的基本单位。 (4)交往性:与其它进程可以进行交互。 (5)异步性:不统一推进。 (6)结构性:每个进程有一个控制块PCB。 (7)并行性:只有在多cpu多处理器的计算机上,进程才能并行执行。 我们谈谈 继续阅读 >>


朱文博 18/08/12 12:06:03
问题描述 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。 Input 三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。 Output 如果能平分的话请输出最少要倒的次数,否则输出"NO"。 Sample Input 7 4 3 4 1 3 0 0 0 Sample Output NO 3 BFS的概念:宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Di 继续阅读 >>


朱文博 18/08/05 17:55:30
问题描述 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 Input 一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。 Output 左上角到右下角的最短路径,格式如样例所示。 Sample Input 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 思路(DFS寻路) 首先将迷宫存在一个二位数组中,然后遍历数组,遇到1则改变方向,遇到0接着向下走,将此点存入队列中,如果无路,则返回上一结点,将此结点移出队列,并将此点的数组值更改为1,防止死循环。直至找到出口。 struct path //定义一个结构体保留遍历到的路径座标 { 继续阅读 >>


朱文博 18/07/30 23:33:27
一 strcpy函数 函数原型: char * strcpy(char *dst, char *src); 函数概念: strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。如果dst指针原来有数据,调用strcpy函数后,会覆盖dst指针中的数据, 而且要保证dst指针的所分配的内存大于等于src的内存,否则会越界。 #include<stdio.h> #include<string.h> int main(void) { char dst[] = "wwwwww"; char str[] = "aaaaaa"; strcpy(dst, str); printf("%s\n", dst); return 0; } //结果为 aaaaaa 二 strncpy函数 函数原型: char *strncpy(char *dst, 继续阅读 >>


朱文博 18/07/29 17:14:44