
C/C++
文章平均质量分 72
左手码农
创世的第七天,他用左手轻轻地敲下:Hello,world!
展开
-
浅谈析构函数
这一节内容,主要是介绍一下析构函数。就像创建对象时将会调用构造函数一样,当要删除一个对象时,程序就会调用析构函数。每一个类都只能有一个析构函数。析构函数没有返回类型,也没有参数。析构函数的名称是在类名称前面加上~。如果构造函数使用new来分配内存,则必须提供使用delete的析构函数来释放这些内存。下述情况下,析构函数将会被调用:1、如果对象是动态变量,则当执行完定义该原创 2015-04-22 11:18:31 · 783 阅读 · 0 评论 -
linux源码分析之字节序(4)-- little_endian.h
本节主要分析小端字节顺序。首先,我们要回顾上一节讲过的大端、小端的概念: 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节原创 2015-04-16 14:57:09 · 1821 阅读 · 0 评论 -
linux源码分析之字节序(3)-- big_endian.h
本节主要分析大端字节顺序。首先,我们要理解大端、小端的概念: 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。因而对原创 2015-04-16 14:36:28 · 2906 阅读 · 0 评论 -
学习STL -- STL 简介
STL简介STL,标准模板库,是C++语言提供的一个基础模板集合,最初由惠普实验室开发,1998年被定为国际标准,成为C++的标准库。在C++标准中,STL 被组织为13个头文件:、、、、、、、、、、、和。STL 由空间管理器、迭代器、泛函、适配器、容器和算法6部分组成,其中前4部分服务于后两部分。空间管理器为容器类模板提供用户自己定义的内存申请和释放功能。默认情况下,ST原创 2015-06-07 14:40:08 · 740 阅读 · 0 评论 -
Linux网络驱动程序
Linux 的网络系统主要是基于 BSD UNIX的套接字机制。在系统与驱动程序之间定义了数据结构 sk_buff进行数据传输。系统支持对发送数据和接收数据缓存,提供流控机制并提供对多协议的支持。1、 linux 网络驱动程序的体系结构linux 网络驱动程序的体系结构从上到下分为4层,各层作用如下:(1) 网络协议接口层向网络层协议提供统一的数据包收发接原创 2015-07-08 11:44:50 · 1632 阅读 · 0 评论 -
学习STL -- 向量vector
在STL中向量vector是使用数组的形式实现的,因此向量具有顺序表的所有特点,可以快速随机存取任意元素。向量是同一种数据类型的对象的集合,每个对象根据其位置有一个整数索引值与其对应,类似于数组。与定义数组不同,向量在实例化是不需要声明长度,标准库负责管理和储存元素相关的内存,不用担心长度不够。vector容器中的元素是连续存放的,当容器中增加一个新元素的时候,如果原来的存储空间刚好被用完,那原创 2015-07-09 16:17:57 · 1212 阅读 · 0 评论 -
学习STL -- 列表list
Vector容器提供了对元素的快速随机访问,但是付出的代价是在其任意位置插入和删除元素,比在容器尾部插入和删除的开销更大。与vector相比,list容器可以在任何位置快速插入和删除,但是付出的代价是元素的随机访问开销更大。采用list的结构实现容器的基本操作与vector容器类似。list 容器与vector 容器有很多相同的接口,像 push_back()、insert()、end()、e原创 2015-07-26 16:23:26 · 772 阅读 · 0 评论 -
浅谈new与delete(2)
上一节介绍了new运算符的常规用法,这一节我们一起来看看定位new运算符的用法。1、定位new运算符是在已分配的内存空间进行二次分配。例如: char *buffer = new char[512]; Point *p = new (buffer) Point(); //Point为类名 Point *q = new (buffer + sizeof(Poin原创 2015-04-23 13:44:20 · 821 阅读 · 0 评论 -
了解指针(3)-- 指针和数组
1、一般而言,数组名代表了数组本身,但如果把数组名看做指针的话,它指向数组的第一个元素的地址。例1:int array[10]={0,1,2,3,4,5,6,7,8,9};int value;value=array[0]; //也可写成:value=*array;value=array[1]; //也可写成:value=*(array+1);value=array[2]原创 2015-04-26 21:27:52 · 467 阅读 · 0 评论 -
linux内核list模块的使用
List模块是linux内核提供的循环链表函数集,头文件是:。主要数据结构:struct list_head { struct list_head *next, *prev;};这是一个双向链表。#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) \ struct原创 2015-07-16 15:35:34 · 2389 阅读 · 0 评论 -
使用 SO_KEEPALIVE 选项检测TCP连接
对于TCP连接来说,如果客户端由于一些异常情况导致断网,从而未能向服务器发起FIN关闭消息,服务端在没有设置存活检测的情况下,该连接会在一定时间内保持存在,有可能会使服务器接入资源耗尽,导致accept失败。解决这个问题,可以通过使用心跳包的方法原创 2015-09-08 17:05:52 · 2741 阅读 · 0 评论 -
CMAKE的使用
转自:http://blog.youkuaiyun.com/netnote/article/details/4051620一、 基本使用安装:下载二进制包后可直接解压使用从源码安装则执行命令:./bootstrap; make; make install——尝试执行bootstrap失败使用:cmake dir_path,生成工程文件或makefile文件二、 概念转载 2015-12-15 15:09:30 · 414 阅读 · 0 评论 -
“段错误”定位及调试的一点经验
今天调试代码的时候,遇到一个问题就是出现了“段错误”。出现“段错误”的原因就是:访问的内存超出了系统给这个程序所设定的内存空间。知道原因是一个很好的开始,但是并不代表就很容易解决,特别是在代码量较大的情况下,如何才能定位到出错的地方?接下来,我就大概讲一下自己的一点经验,如何在Linux C中用几个命令搞定“段错误”。1、dmesg通过dmesg命令可以查看发生段错误的程序名称、引起段错误原创 2015-12-15 14:39:01 · 7883 阅读 · 1 评论 -
Netlink通信机制
1、Netlink 机制简介为了完成内核空间与用户空间通信,Linux提供了基于socket的Netlink通信机制,可以实现内核与用户空间数据的及时交换。Netlink是基于socket的通信机制,由于socket本身的双共性、突发性、不阻塞特点,因此能够很好的满足内核与用户空间小量数据的及时交互,因此在Linux 2.6内核中广泛使用,例如SELinux,Linux系统的防火墙分为内核态的原创 2015-12-26 13:57:45 · 2560 阅读 · 0 评论 -
linux下ACE工具包的编译安装
ACE简介ACE(ADAPTIVE 通信环境)是一种广泛使用的主机基础设施中间件。ACE库包含约240,000行c++代码,约500个类。ACE软件包的基础是ACE OS Adaptation层和C++ wrapper facades 的结合,封装了核心OS并发网络编程机制。ACE的较高层建立在这一基础上,提供了可复用的框架、网络服务组件、基于标准的中间件等。这些中间件层联合起来,简化了网原创 2016-04-07 16:29:55 · 2145 阅读 · 1 评论 -
Epoll简介以及例子
第一部分:Epoll简介在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。epoll的接口非常简单,一共就三个函数:1.转载 2016-04-15 17:13:31 · 3217 阅读 · 0 评论 -
ping的实现和代码分析
转自 http://blog.youkuaiyun.com/zzucsliang/article/details/41407387介绍 ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。分析转载 2016-04-17 17:10:48 · 941 阅读 · 0 评论 -
网际协议IP
在IP层的分组叫做数据报。本节主要介绍数据报的格式,以及在 linux 中是如何定义IP分组头格式。首先,数据报的格式如下:其中:1、版本:有版本4和版本62、首部长度:定义数据报的总长度,以4字节为单位计算。首部长度在 20~60字节之间。3、服务类型:前三位为优先位,后面两位为TOS位,最后一位没有使用。4、总长度:定义以字节计的数据报总长度(首部加上数据)原创 2015-04-16 20:53:35 · 1231 阅读 · 0 评论 -
随机数生成
标准C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,定义在stdlib.h, 其值与系统有关。 查看stdlib.h文件:/* The largest number rand will return (same as INT_MAX). */ #define RAND_MAX 214748原创 2015-05-28 23:59:15 · 1049 阅读 · 0 评论 -
linux源码分析之位长定义 -- bitsperlong.h
我们知道,在Linux内核中,不同CPU里面,不同CPU的字节序定义不同。本节年内容主要是讲的是:不同CPU里面,各自的位长定义也是不同。本次用于分析的 Linux 内核版本为: linux--3.0.0-12。 arch/XXX/include/asm/bitsperlong.h:不同CPU(XXX)的位长定义1)ARM(XXX=arm): #includ原创 2015-04-15 10:48:59 · 3306 阅读 · 0 评论 -
浅谈new与delete(1)
new运算符的作用是完成动态内存分配和初始化工作。 对应的,delete运算符的作用就是完成清理与释放内存工作。 在类构造函数中,可以使用new为数据分配内存,并将内存地址赋予类成员。这样一来,类就可以处理长度不同的字符串,而不用在类设计时就提前固定数组的长度。 但是,如果对象包含成员指针,同时它指向的内存是由new分配的,则当释放用于保存原创 2015-04-22 18:57:48 · 620 阅读 · 0 评论 -
NS3实例分析(2)-- first.cc
这一节我们开始分析第二个例子 first.cc 。网络拓扑就下所示:// Default Network Topology//// 10.1.1.0// n0 -------------- n1 // point-to-point // // 这是一个P2P模型。我们原创 2015-04-23 12:34:19 · 4664 阅读 · 0 评论 -
NS3实例分析(4)-- third.cc
这一节主要是分析第三个例子 third.cc。 该例子包含了P2P信道,以太信道和WiFi信道。网络拓扑如下:// Default Network Topology//// Wifi 10.1.3.0// AP// * * * *// | | | | 10.1.1.0// n5 n原创 2015-04-23 21:58:36 · 5910 阅读 · 0 评论 -
NS3实例分析(3)-- second.cc
这一小节我们来看看第三个例子,这个例子应用了一个P2P信道和一个实现CSMA的以太信道。网络拓扑如下:// Default Network Topology//// 10.1.1.0// n0 -------------- n1 n2 n3 n4// point-to-point | | | |//原创 2015-04-23 20:36:50 · 6317 阅读 · 0 评论 -
linux中sparce与__be32
be表示big endian,大端,le表示小端。__be32,__le32都是一样的,其实就是__u32,具体是什么端数据又系统决定的。网络协议也是采用大端数据。目前主要是用来发现大小端不匹配的错误。比如往big-endian的寄存器里面写入little-endian的数据。cpu_to_be32() /*convert cpu's byte order to big-转载 2015-04-14 21:49:02 · 1626 阅读 · 0 评论 -
linux源码分析之字节序(1)-- byteorder.h
首先我们要知道的一点是:在Linux内核中,不同CPU里面,各自的字节序定义都不同。本次用于分析的 Linux 内核版本为: linux--3.0.0-12。 arch/XXX/include/asm/byteorder.h:不同CPU(XXX)的字节序定义1)ARM(XXX=arm):#ifdef __ARMEB__#include #else原创 2015-04-15 00:44:41 · 1097 阅读 · 0 评论 -
linux源码分析之字节序(2)-- types.h
这一节主要讲linux的数据类型,主要是为了方便理解接下来将大端、小段字节序定义的源码。首先,来看看 include/linux/types.h 源码:------------------------------------------------------------------ #ifndef _LINUX_TYPES_H #define _LINUX_TYPES_H原创 2015-04-15 11:21:46 · 1936 阅读 · 0 评论 -
linux源码分析之字节序(5)-- swab.h
在linux源码分析之字节序(3)、linux源码分析之字节序(4)中都有看到,源码中包含了 #include 该头函数里面介绍了字节交换的具体方法。我们来看看具体代码:----------------------------------------------------------------------------------------------------原创 2015-04-16 16:32:00 · 2564 阅读 · 0 评论 -
了解指针(2)-- 指针算术
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。指针加1的结果等于原来的地址值加上指向的对象占用的总字节数。指针的相减将得到一个整数,仅当两个指针指向同一个数组时这种运算才有意义,这将得到两个元素的间隔。例1:char a[20];int *ptr=(int *)a; //强制类型转换并不会改变 a 的类型ptr++; 在上例中原创 2015-04-26 20:40:06 · 569 阅读 · 0 评论 -
了解指针(4)-- 指针和结构类型
我们之前介绍了指针和数组的关系。这一节介绍指针和结构类型的关系。我们可以声明一个指向结构类型对象的指针。例1:struct MyStruct{ int a; int b; int c;};struct MyStruct ss={20,30,40}; //创建结构对象 ss, 并把 ss 的成员初始化为 20, 30 和 40。st原创 2015-04-26 21:49:39 · 639 阅读 · 0 评论 -
了解指针(5)-- 指针和函数
就像数组名是指向数组的第一个元素的常指针一样,函数名也是指向函数的常指针。可以声明一个指向函数的指针变量,并且用这个指针调用其他函数(只要这个函数和你的函数指针在签名、返回、参数值方面一致即可)。例1: long (* fun) (int) 上面就是一个函数指针,该指针返回值类型是long,所带的参数类型是int。例2:int fun(char *,int);原创 2015-04-26 22:23:16 · 757 阅读 · 0 评论 -
了解指针(1)-- 指针的四要素
指针是 C/C++ 功能最强大的工具之一,也是最危险的,因为他们允许执行对计算机不友好的操作,比如使用未经初始化的指针来访问内存或者试图释放同一个内存块两次。 本小节主要介绍指针的基本知识。 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。指针的四要素:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。1.指针的类型原创 2015-04-26 19:43:06 · 1883 阅读 · 0 评论 -
飞鸽传书源码分析-程序启动过程
本文章是在飞鸽传书的2.06源码基础上分析飞鸽传书源码运行流程如下,本篇文章只说明了飞鸽传书的启动过程,对于飞鸽伟书的消息机制及菜单加载等功能都不在本篇文章范围之内。1. WinMain函数[cpp] view plaincopyint WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdLine, int转载 2015-04-27 00:05:59 · 935 阅读 · 0 评论 -
纯虚函数与抽象基类
这一节我们主要介绍一下抽象基类与纯虚函数的关系首先,我们来看看纯虚函数1、纯虚函数的定义 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”。如下 virtual void funtion()=0 2、定义纯虚函数的目的和意义 定义纯虚函数是为了实现一个接原创 2015-04-27 11:03:12 · 881 阅读 · 0 评论 -
NS2网络仿真的过程
NS2网络仿真的过程可以总结为:1、初始化 创建ns simulator 创建.tr文件(记录仿真结果) 创建.nam文件(记录仿真过程) 设置结束函数 设置仿真中所需的参数2、创建仿真拓扑 创建节点 创建并设置链路 设置链路各链路在nam中的排列方式3、创建流量 探测流量:向网络中添加的额外流量原创 2015-05-09 00:18:34 · 6706 阅读 · 0 评论 -
Trace命令的实现
Trace命令的实现【trace原理】traceroute是用来跟踪路由的命令,可以查看数据包从一端到另一端的路线。当源执行traceroute的时候,第一个数据包的TTL设置为1,那么下一跳的路由器收到数据包之后会丢弃数据包,并且会向源发送一条错误信息,源通过阅读错误信息从而得知发送错误信息的路由器就是第一跳。源第二次发送数据包的时候把TTL的值设置为2,第二跳的路由器发送错误信息过原创 2015-05-12 13:03:10 · 1715 阅读 · 0 评论 -
NS3实例分析(1)-- hello-simulator.cc
这一节,我们就NS3第一个例子,也是最简单的例子hello 开始学习。以下是 hello-simulator.cc 的源码:---------------------------------------------------------------------------------------#include "ns3/core-module.h"//声明了一个叫Hello原创 2015-04-22 23:20:37 · 3060 阅读 · 0 评论 -
常用的几个设计模式
设计模式是一些编程方式,用来解决某一类特殊问题的一种最佳实践,在面向对象编程中有着举足轻重的地位。设计模式可以分成3个大类:创建型模式结构型模式行为型模式其中,创建型模式用以创建对象。包含了创建者模式、工厂模式、原型模式和单例模式结构型模式帮助我们创造和使用复杂的结构。包含了适配器模式、桥接模式、组合模式、装饰模式、外观模式和代理模式行为型模式描述了对象在系统中的通信方式和原创 2016-07-28 12:24:20 · 428 阅读 · 0 评论