野指针 一、定义野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单的if判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。二、产生原因 (1)指针变量未初始化任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。 (2)指针释放后之后未...
网络层(二)——划分子网和构造超网 1、划分子网为什么要划分子网?IP地址空间的利用率有时很低两级IP地址不够灵活划分子网的基本思路如下:(1)一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网。本单位以外的网络看不见这个网络是由多少子网组成的,因为这个单位对外仍表现为一个网络。(2)从网络的主机号借用若干位作为子网号,当然主机号也就减少了同样的位数。于是两级IP地址在本单位内部就变为三级IP地址:网络号、子网号和主机号...
网络层(一)—— 网际协议IP 网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。与IP协议配套使用的还有三个协议: 地址解析协议ARP(Address Resolution Protocol) 网际控制报文协议ICMP(Internet Control Message Protocol) 网际组管理协议IGMP(Internet Group Management Protocol) 将网...
计算机网络——数据链路层 数据链路层使用的信道主要有以下两种类型: 1、点对点信道:使用一对一的点对点通信方式 2、广播信道:使用一对多的广播通信方式使用点对点信道的数据链路层当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输。若把这实现这些协议的硬件和软件加到链路上,就构成了数据链路。现在最常见的方法是使用网络适配器(既有硬件,又有软件)来实现这些协议。点对...
计算机网络——物理层 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。现有的计算机网络中的硬件设备和传输媒体的种类非常繁多,而通信手段也有许多不同方式。物理层的作用正式要屏蔽掉这些传输媒体和通信手段的差异,使物理层上面的数据链路层感觉不到这些差异,这样就可以使数据链路层只需要考虑如何完成本层的协议和服务,而不必考虑网络具体的传输媒体和通信手段是什么。可以将物理层的主要任...
计算机网络概述 互联网概述计算机网络由若干结点和连接这些结点的链路组成。网络中的结点可以是计算机、集线器、交换机或路由器等。网络之间通过路由器互连起来,就构成了一个覆盖范围更大的计算机网络,这样的网络称为互连网。网络把许多计算机连接在一起,而互连网则把许多网络通过路由器连接在一起。ISP(Internet Service Provider):互联网服务提供商。互联网的组成: 边缘部分:由所有连接在互联网上的...
I/O复用的系统调用——select I/O复用使得程序能监听多个文件描述符,这对提高程序的性能至关重要。I/O复用虽然能同时监听多个文件描述符,但它本身是阻塞的,并且当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依次处理其中的每一个文件描述符,这使得服务器程序看起来像是串行工作的。如果要实现并发,只能使用多进程或多线程等编程手段。Linux下实现I/O复用的系统调用主要有select、poll、epoll
类对象的生存周期 请先来看一段代码#include#includeusing namespace std;class CGoods{public: CGoods(){} CGoods(float){} CGoods(char *name,int amount,float price) { _name=new char[strlen(name)+1]; strcpy(_name,n
C++中类的6个默认函数 类的6个默认的成员函数包括:构造函数、析构函数、拷贝构造函数、赋值运算符重载函数、取地址操作符重载、const修饰的取地址操作符重载。以下详细介绍前四个函数。一、构造函数构造函数:初始化对象的内存地址空间。CGoods(){ _name=new char[1];}实例化一个对象:1、分配对象内存空间2、调用对象的构造函数初始化:定义的同时
面向对象的语言C++ C++三大特征:封装、继承、多态访问限定符:1、public 任意位置都能访问2、protected 子类可以访问父类中的保护成员3、private 只有在类中才能访问定义一个类:class CGoods //类名首字母大写,以C开头表示class{public: void Register(char *name,int amou
Linux下的网络编程(二)UDP编程 UDP协议(用户数据报协议):它为应用层提供不可靠、无连接和基于数据报的服务。“不可靠”意味着UDP协议无法保证数据从发送端正确地传送到目的端。如果数据早中途丢失,或者目的端通过数据校验发现数据错误而将其丢弃,则UDP协议只是简单地通知应用程序发送失败。因此,使用UDP协议的应用程序通常要自己处理数据确认、超时重传等逻辑。UDP协议是无连接的,即通信双方不保持一个长久的联系,因此应用程序每次发送数
TCP协议详解 TCP协议是TCP/IP协议族中另一个重要的协议。和IP协议相比,TCP协议更靠近应用层,因此在应用程序中具有更强的可操作性。 TCP头部信息:16位端口号:告知主机该报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。32位序号:一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号,32位确认号:用作对另一方发送来的TCP报文
Linux下的网络编程(一)TCP编程 服务器与客户端的概念:服务器: 在一次通讯中,提供数据的为服务器客户端: 在一次通讯中,获取数据的为客户端协议的选择(两种不同的协议有两种不同的编程方式):TCP: 面向连接的(不断发送数据) 可靠的(数据完整,例如银行交易往来数据) 流式服务UDP: 无连接(间断发送数据) 不可靠的(可能会有数据丢失,例如视频数
C与C++的区别(一) 一、带有默认的函数 形参变量的默认值从右往左给,例如 int sum(int a,int b=20); 下面来看两个例子: int sum(int a,int b=20); int sum(int a,int b=20); //错误,因为在一个文件中,声明可以无数次,但默认值只能给一次 int sum(int a,int
函数调用堆栈 1.函数调用堆栈 压栈 调用函数: 1.压入形参变量的地址和值 2.压入函数调用返回后要执行的指令的地址 被调用函数: 1.压入调用函数的栈底指针,把栈底指针寄存器指向被调用函数的栈底 2.开辟被调用函数的栈帧大小,并初始化为CC清栈 被调用函数
线程控制(一) 一、什么是线程 线程有时被称为轻量级进程,是程序执行流的最小单位。线程是进程内部的一条执行序列(执行流),每个进程至少有一条执行序列:main的执行体。进程可以通过线程库创建 N 条线程,这些新创建的线程称之为函数线程, main 函数所代表的线程为主线程。 一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成。通常意义下,一个进程由一个到多
进程间通讯(四)共享内存 一、什么是共享内存 共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址。二、定义#include int shmget(key_t key, size_t si
进程间通讯(三)消息队列 一、什么是消息队列 消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。 消息队列提供了一种在两个不相关的进程之间传递数据的相当简单且有效的方法。 消息队列函数的定义如下:#include int msgctl(intmsgid, int cmd, struct msgid_ds *buff);int msgget(key_t key
进程间通讯(二)信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。什么是信号量:信号量是一个特殊的变量,程序对其访问都是原子操