自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C语言如何实现继承和多态

使用函数指针来实现继承和多态#include <stdio.h>#include <stdlib.h>struct Base_Vptr //虚函数表{ void(*fun1)( void*); void(*fun2)( void*);};struct Base{ struct Base_Vptr* base_v

2017-07-29 09:56:12 429

原创 TCP为什么要进行三次握手四次挥手

先看一下三次握手的过程: 为什么要进行三次握手而不是两次握手呢? 假设是两次握手的情况下:A向B发了一个第一个请求连接报文,此时又于选择了一条较长的路径导致这个请求,传输的时间较长,以致延误到连接释放以后的某个时间才到达server,但是此时A认为发了一个请求连接的报文B没有收到,因此A进行重传,此时这个新的请求连接报文B很快就收到了,于是B向A发送确认报文段,同意连接,于是A和B开始互发数

2017-07-25 19:01:00 725

原创 socket套接字编写多线程多进程的server和client

关于套接字编程 套接字编程 IP地址+端口号就成为套接字 在TCP协议中。建立两个连接的进程个字有一个socket来标识,那么这两个socket组成desocketpair就表示一个唯一链接 socket用来描述网络连接一对一关系 socket地址的数据类型及相关函数 第一个是通用接口 第二个表示IPV4的地址使用socketaddr_in 第三个表示预间套接字 这样我们只需要

2017-07-25 12:51:30 1003

原创 STL之空间配置器

最近在看侯捷老师写的STL源码剖析,想通过看优秀的代码来提高自己的编程水平。 首先STL提供了六大组件,彼此可以套用使用。 借助一张从书上截的图来表明: Container通过Allocator来获取数据存储空间 Algorithms通过迭代器来获取Container的内容,Functors可以协助Algorithms完成不同策略变化 Adapter可以修饰或者套接Functor由此可

2017-07-22 11:39:55 507

原创 URG和PSH

URG: 急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。T C P的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据,不进入接收缓冲就直接交给上层进程,余下的数据要进入接收缓冲的)值得注意的是即使窗口为0时也可以发送紧急数据,紧急数据不进入接收缓冲区直接交给上层进程。 PSH:当两个应用进程进行

2017-07-20 23:24:21 392

原创 tcp定时器

我们都知道,TCP发送的报文段是要交给IP层传送的,但IP层只能提供尽最大努力服务。也就是说TCP下面的网络所提供的是不可靠传输。因此TCP必须采取适当的策略。而定时器就发挥作用。 TCP管理的4个不同的定时器:1.重传定时器:用于当希望收到另一端的确认。2.坚持定时器:使窗口大小信息保持不断流动。3.保活定时器:检测TCP空闲连接的另一端何时崩溃或重启。4.2MSL定时器:测量一个连接处于TIM

2017-07-16 14:22:22 328

原创 端口分类

一、端口 通俗地讲,端口(Port)就是电脑向网络开放的信息出入“门户”。和小区大门不同的是,在电脑上这种“门户”有个256×256(65535)个,而且它们还有多种状态。1.端口的分类 根据端口和服务的绑定情况,端口可分为公认端口、注册端口和动态端口。 公认端口:0~1023。这个范围内的端口系统一般保留给一些常用的系统服务,比如WEB服务使用80端口,FTP服务使用21端口

2017-07-16 13:59:28 4189

原创 crond和crontab

Crond是linux系统用来定期执行命令或指定程序任务的一种服务或软件。一般情况下,我们安装完CentOS5/6linux操作系统之后,默认便会启动Crond任务调度服务。Crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作。如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作。这个Crond定时任务服务就相当于我们早上使用的闹钟一样。crontab是一个很方便的在

2017-07-16 10:46:15 364

原创 路由生产算法调研

路由算法是路由选择协议的核心。路由算法指明了计算机网络中的结点机(或路由器)在接收到一个分组之后,应该选择哪条输出链路的策略。当采用虚电路通信时,路由是在建立呼叫链接是确立的,即一次性选择路由,后继的分组均沿着这条既定的路由传送。当采用数据报通信时,路由器要为每个分组做出路由选择。因此通信子网采用不同的通信方式,路由算法的使用额度是不一样的。 一个实际的路由算法不可能做到尽善尽美,只能比较接近理想

2017-07-12 16:28:06 396

原创 NAT技术与代理服务器

什么是NAT技术: NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。 这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全

2017-07-11 16:18:32 697

原创 浅谈ARP协议

OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层。 在这里只谈TCP/IP模型 ARP协议是一种地址解析协议,在实际应用中 ,我们经常会遇到这样的问题,已经知道啦一个主机的IP地址,需要找出与之相应的物理地址,或者反过来已经知道了物理地址需要找出相应的IP地址。地址解析协议ARP和逆地址解析协议就是用来解决这样的问题的。 IP地址是表示网络中不同主机的地址,

2017-07-09 16:05:57 566

原创 可重入函数与线程安全

可重入函数: 可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误。 (1)可以在执行的过程中可以被打断; (2)被打断之后,在该函数一次调用执行完之前,可以再次被调用(或进入,reentered)。 (3)再次调用执行完之后,被打断的上次调用可以继续恢复执行

2017-07-09 10:52:09 572

原创 子进程的异步等待方式

SIGCHLD,在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。#include<stdio.h>#include <sys/types.h>#include <sys/wait.h>#include<signal.h>void myhandler(int sig){ printf("i

2017-07-09 09:44:40 220

原创 CRC校验

差错控制 传输过程中可能会产生比特差错:1可能会变成0而0也可能变成1 为了保证数据传输的可靠性,在计算机网路输数据时,必须采用各种差错检测措施 循环冗余检验CRC 在数据链路层传送的帧中,广泛使用了循环冗余检验CRC技术 在发送端,先把数据划分成组,假设每组k个比特,假设待传送的一组数据M=101001(现在k=6)。我们在M的后面再添加差错检测用的冗余码一起发送冗余码的计算 用二

2017-07-09 08:44:16 1549

原创 并查集

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中的这种数据结构叫做并查集。 已知有N个人和m对好友关系,如果这两个人士直接好友或者间接的好友(好友的好友….)则认为他们属于同一个朋友圈,n=5,m=3,r={{1,2},{2,3},{4,5}}求出这n个人里一共有多少个朋友

2017-07-06 10:39:17 335 2

原创 守护进程

守护进程也称精灵进程( Daemon),是运行在后台的⼀一种特殊进程。它独立于控制终端并 且周期性地执行某种任务或等待处理某些发生的事件。守护进程是⼀一种很有用的进程。 Linux的⼤大多数服务器就是⽤用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd 等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等 Linux系统启动时会启动很多系统服务进程,这些系

2017-07-05 21:56:30 421

原创 归并排序

基本思想:将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后将他们 合并成一个序列。合并两个子序列的过程称为两路归并.void _Merge(int*arr, int*tmp, int begin1, int end1, int begin2, int end2){ int index = 0; while (begin1 <= end1&&begin2 <= e

2017-07-05 11:13:24 183

原创 交换排序

void BubbleSort(int *arr,int n){ int end = n - 1; while (end > 0) { bool flag = false; for (int i = 0; i < end; ++i) { if (arr[i]>arr[i + 1])

2017-07-04 16:02:15 440

原创 选择排序和堆排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法,选择排序是一种时间复杂度为O(N^2)的算法void SelectSort(int*arr, int n){ int left = 0; int right = n;

2017-07-02 11:23:17 262

原创 生产者消费者模型

生产者消费者模型遵循三二一原则 三种关系:生产者和生产者 :互斥 消费者和消费者:互斥 生产者和消费者:同步与互斥 两种角色 一个交易场所条件变量的作用:判断临界资源中生产消费的条件是否成熟通常情况下互斥锁和条件变量搭配使用对单链表的操作#include<stdio.h>#include<pthread.h>#i

2017-07-02 08:21:22 310

原创 Linux下的SIGCHLD信号

在之前我们为了避免出现僵尸进程我们采用了两种方式 1、调用wait()函数使父进程去等待子进程。wait()是一种阻塞等待 2、调用waitpid()函数这也是父进程去等待子进程而waitpid()分为阻塞式等待和非阻塞式等待,轮询的方式就是建立在非阻塞等待的基础之上的而SIGCHILD信号也可以避免出现僵尸进程创建僵尸进程#include<stdio.h>#include <unistd.

2017-07-02 08:02:45 636

原创 Linux下mysleep的实现

第一种方式:mysleep的实现实际上是利用alarm(timeout)函数和利用pause函数将当前进程挂起pause函数使调用进程挂起直到有信号递达。如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause 不返回;如果信号的处理动作是捕捉,则调用了信号处理函数之后pause返回-1,errno设置为 EINTR, 所以p

2017-07-01 18:33:42 440

原创 直接插入排序和希尔排序

直接插入排序是先将第一个数当做有序区,然后对之后的数进行排序依次将它们放入有序区 void InsertSort(int*arr, int n){ for (int i = 0; i < n - 1; ++i) { int end=i; int tmp = arr[end + 1]; while (end >= 0)

2017-07-01 12:38:05 449

空空如也

空空如也

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

TA关注的人

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