自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ctthuangcheng

自学成才。。。。加油!

  • 博客(42)
  • 资源 (4)
  • 收藏
  • 关注

原创 Effective C++ ——模板和泛型编程

条款41:了解隐式接口和编译器多态       以public继承的类,

2013-08-25 16:12:47 1618

原创 Effective C++ ——继承与面向对象设计

条款32:确定你的public继承塑模出is-a关系       以public继承的类,其父类的所有的性质都应该使用与子类,任何需要父类的地方都应该能用子类来代替,任何子类类型的对象也同时是父类的:class Person{...};class Student : public Person{...};void eat(const Person& p);void study(const S

2013-08-25 03:00:46 1622

原创 Effective C++ ——实现

条款26:尽可能延后变量定义式的出现时间       当你定义一个变量的时候就要保证这个变量能够在程序中使用到,不要定义无意义的变量,这样就要求我们最好是在变量使用到的时候才做定义,因为如果一个变量定义了却不使用可能会造成效率上的降低,毕竟很多变量的构建是要调用对应的构造函数和析构函数的,考虑下面的例子:std::string setName(std::string& name){ string

2013-08-25 01:36:13 1551

原创 Effective C++ ——设计与声明

条款18:让接口更容易的被使用,不易误用       接口设计主要是给应用接口的人使用的,他们可能不是接口的设计者,这样作为接口的设计者就要对接口的定义更加易懂,让使用者不宜发生误用,例如对于一个时间类:class Date{public: Data(int month, int day, int year){ .... }};       在应用Date类的时候,对

2013-08-25 01:04:06 1501

原创 Effective C++ ——资源管理

条款13:以对象来管理资源       在C++中我们经常会涉及到资源的申请与申请,一般都是由关键字new 和 delete来操作的,两者都是成对存在的,缺一不可,否则会出现意想不到的问题,例如:class Investment{.....};Investment* pinv = createInvestment();       我们在使用完后要动态的释放掉pinv所指向的资源,例如在下面的函

2013-08-24 18:54:15 1717 1

原创 Effective C++ ——构造/析构/赋值运算符

条款五:了解C++默认编写并调用那些函数        是否处在空的类?       假设定义类为class Empty{};当C++编译器处理过后会变成如下的形式:class Empty{ Empty(){} ~Empty(){} Empty& operator=(const Empty& rhs){.....} Empty(const Empty& rhs){.....}}

2013-08-24 17:33:07 2853

原创 大数相加

基本思路:字符串反转、字符变数字、位运算、反序输出#include#include#define Max 101void print(char sum[]);void bigNumAdd(char a[],char b[],char sum[]);int main(){ char a[Max]; char b[Max]; char sum[Max]; gets(a); get

2013-08-12 21:10:02 1307

转载 Linux音频编程指南

一、数字音频       音频信号是一种连续变化的模拟信号,但计算机只能处理和记录二进制的数字信号,由自然音源得到的音频信号必须经过一定的变换,成为数字音频信号之后,才能送到计算机中作进一步的处理。       数字音频系统通过将声波的波型转换成一系列二进制数据,来实现对原始声音的重现,实现这一步骤的设备常被称为模/数转换器(A/D)。A/D转换器以每秒钟上万次的速率对声波进行采样,每个采样点都记

2013-08-12 14:38:41 1759

转载 理解 Linux 的硬链接与软链接

Linux 的文件与目录       现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程创建信息的逻辑单元可被多个进程并发使用。在 UNIX 系统中,操作系统为磁盘上的文本与图像、鼠标与键盘等输入设备及网络交互等 I/O 操作设计了一组通用 API,使他们被处理时均可统一使用字节流方式。换言之,UNIX 系统中除进程之外的一切皆是文件,而 Linux 保持了这一特性。为了便于

2013-08-12 14:02:11 2625

转载 一个 Linux 上分析死锁的简单方法

简介       死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一

2013-08-12 11:20:06 2115

原创 char能表示(-128~127)

char 的取值范围是 -128 ~127       由于-128的原码用8位无法表示,所以必须扩展到16位去表示,然后对16位的原码计算出16位的反码和补码,最后对16位的补码作低8位的截断,截断的低8位的值就是-128的补码了。// 8位所能表示的 原码 的范围-127到+127// 8位所能表示的 反码 的范围-127到+127// 8位所能表示的 补码 的范围-128到+127

2013-08-04 21:19:25 2008 1

转载 UNIX网络编程——ioctl 函数的用法详解

1.介绍       Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口。并且还能够查看,修改,删除ARP高速缓存的信息,所以,我们有必要了解一下ioctl函数的具体实现。2.相关结构体与相关函数#include int ioctl(int d,int request,....);参数:d-文件描述

2013-08-04 15:47:31 4733

转载 UNIX网络编程——原始套接字(dos攻击)

原始套接字(SOCK_RAW)。应用原始套接字,我们可以编写出由TCP和UDP套接字不能够实现的功能。       注意原始套接字只能够由有 root权限的人创建。       可以参考前面的博客UNIX网络编程——原始套接字的魔力【上】>>。/******************** DOS.c *****************/#include #inclu

2013-08-04 14:51:04 1855

转载 UNIX网络编程——尝试探索基于Linux C的网卡抓包过程

其实想探究网卡抓包问题已经有好久了。前几天找了时间算是基本上了解了那部分的一些基本东西,在这里只是赘述罢了。抓包首先便要知道经过网卡的数据其实都是通过底层的链路层(MAC),在Linux系统中我们获取网卡的数据流量其实是直接从链路层收发数据帧。至于如何进行TCP/UDP连接本文就不再赘述(之前的一段关于web server的程序已经大概说明),直接从最关键的原始套接字( raw socket)开始

2013-08-04 14:09:53 3223

转载 UNIX网络编程——揭开网络编程常见API的面纱【下】

Linux网络编程数据收发的API流程分析       只要把数据在协议栈中的流动线路和脉络弄清楚了,关于协议栈的实现部分,理解起来就轻松多了。在网络编程章节的数据接收过程中,我们主要介绍过read()、recv()、recvfrom()还有一个recvmsg()没介绍到,今天我们就来看一下这几个API函数到底有什么差别。 数据接收       在接收数据的过程,主要分两个阶段:BOTTOM-HA

2013-08-04 13:47:20 1727

转载 UNIX网络编程——揭开网络编程常见API的面纱【上】

Linux网络编程API函数初步剖析       今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。       1、socket(family,type,protocol)       当我们在开发网络应用程序时,使用该系统调用来创建一个套接字。该API所做的工作如下所示:

2013-08-04 13:33:31 1969

转载 UNIX网络编程——原始套接字的魔力【续】

如何从链路层直接发送数据帧       上一篇里面提到的是从链路层“收发”数据,该篇是从链路层发送数据帧。       上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑定到本地一个接口上,然后该套接字就只接收从该接口收上来的对应的数据包。今天我们用原始套接字来手工实现链路层ARP报文的发送和接收,以便大家对原始套接字有更深刻的掌握和理解。       ARP全称

2013-08-04 03:33:41 2709

转载 UNIX网络编程——原始套接字的魔力【下】

可以接收链路层MAC帧的原始套接字       前面我们介绍过了通过原始套接字socket(AF_INET, SOCK_RAW, protocol)我们可以直接实现自行构造整个IP报文,然后对其收发。提醒一点,在用这种方式构造原始IP报文时,第三个参数protocol不能用IPPROTO_IP,这样会让系统疑惑,不知道该用什么协议来伺候你了。       今天我们介绍原始套接字的另一种用法:直接从

2013-08-04 01:33:49 2678

转载 UNIX网络编程——原始套接字的魔力【上】

基于原始套接字编程       在开发面向连接的TCP和面向无连接的UDP程序时,我们所关心的核心问题在于数据收发层面,数据的传输特性由TCP或UDP来保证:                   也就是说,对于TCP或UDP的程序开发,焦点在Data字段,我们没法直接对TCP或UDP头部字段进行赤裸裸的修改,当然还有IP头。换句话说,我们对它们头部操作的空间非常受限,只能使用它们已经开放给我们的诸

2013-08-03 22:38:29 2799 1

原创 UNIX网络编程——原始套接字SOCK_RAW

实际上,我们常用的网络编程都是在应用层的报文的收发操作,也就是大多数程序员接触到的流式套接字(SOCK_STREAM)和数据包式套接字(SOCK_DGRAM)。而这些数据包都是由系统提供的协议栈实现,用户只需要填充应用层报文即可,由系统完成底层报文头的填充并发送。然而在某些情况下需要执行更底层的操作,比如修改报文头、避开系统协议栈等。这个时候就需要使用其他的方式来实现。一 原始套接字

2013-08-03 18:08:49 6328

转载 UNIX环境高级编程——Linux终端设备详解

终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是Teletype的缩写。Teletype是最早出现的一种终端设备,很象电传打字机(或者说就是),是由Teletype公司生产的。在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种:1.串行端口终端(/dev/ttySn)串行端口终端(Serial Port Terminal)是使用计算

2013-08-03 16:25:07 1727

转载 UNIX网络编程——网络IPC:套接字

Contents套接字接口套接字描述符寻址字节序地址格式地址查询绑定地址建立连接数据传输套接字选项带外数据UNIX域套接字使用套接字的示例面向连接的ruptime无连接的ruptime套接字接口套接字接口是一组用来结合UNIX I/O函数进行进程间通信的函数,大多数系统上都实现了它,包括各种UNIX变种、Windows和Mac系统。套接字接口套接字描述符套接字是通信端点的抽象,使用套接字描述符访问

2013-08-03 15:28:54 2448

转载 UNIX网络编程——Socket通信原理和实践

我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下:1、网络中进程之间如何通信?2、Socket是什么?3、socket的基

2013-08-03 14:38:19 3336

原创 UNIX环境高级编程——单实例的守护进程

#include #include #include #include #include #include #include #include #include #include /* 创建守护进程函数 */int daemonize(){ int childpid, fd, fdtablesize; int error, in, out; /* 忽略终端I/O信号,S

2013-08-03 03:08:23 1708

原创 UNIX环境高级编程——初始化一个守护进程

#include #include #include #include #include #include #include #include #include /* 创建守护进程函数 */int daemonize(){ int childpid, fd, fdtablesize; int error, in, out; /* 忽略终端I/O信号,STOP信号 */

2013-08-03 03:05:54 1572

原创 UNIX环境高级编程——创建孤儿进程

/* 创建孤儿进程 父进程终止后,向子进程发送挂断信号,又接着发送继续信号。 */ #include #include #include #include #include #include #include /* 处理接受到的挂断信号 */ static void sig_hup(int signo) {

2013-08-03 02:44:52 1521

原创 UNIX环境高级编程——实现uid to name

setpwent()用来将getpwent()的读写地址指回文件开头,即从头读取密码文件中的账号数据。strcut passwd * getpwent(void);       getpwent()用来从密码文件(/etc/passwd)中读取一项用户数据,该用户的数据以passwd 结构返回。第一次调用时会取得第一位用户数据,之后每调用一次就会返回下一项数据,直到已无任何数据时返回NULL。

2013-08-03 02:27:42 1755

原创 UNIX环境高级编程——标准IO-实现查看所有用户

#include #include #include #include int main(int argc, char *argv[]){ char szBuf[512]; char szName[512]; FILE *f = fopen("/etc/passwd","r"); memset(szBuf, 0, sizeof(szBuf)); int i; while(fg

2013-08-03 02:03:09 1436

原创 UNIX环境高级编程——环境变量表读取/添加/修改/删除

#include #include #include int main(){ char* pValue; pValue = getenv("HOME"); // 起始目录(主目录) printf("$HOME = %s\n", pValue); // 在主目录下建立a.txt文件 char szFilePath[100]; strcpy(szFilePath, pValue)

2013-08-03 01:56:21 1767

转载 UNIX网络编程——进程间通信概述

一、顺序程序与并发程序特征顺序程序特征顺序性封闭性:(运行环境的封闭性)确定性可再现性并发程序特征共享性并发性随机性二、进程互斥1、由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥2、系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。3、在进程中涉及到互斥资源的程序段叫临界区举例如下图:假设x = 1; 当A进程已经判

2013-08-03 00:20:37 1641

转载 UNIX网络编程——通过UNIX域套接字传递描述符和 sendmsg/recvmsg 函数

在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描述符。       下面先来看两个函数:#include #include ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);ssize_t recvmsg(int sockfd, struct msghdr

2013-08-03 00:09:35 2103

转载 UNIX网络编程——UNIX域套接字编程和socketpair 函数

一、UNIX Domain Socket IPC       socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校

2013-08-02 19:04:26 2403

转载 UNIX网络编程——epoll 系列函数简介、与select、poll 的区别

一、epoll 系列函数简介#include int epoll_create(int size);int epoll_create1(int flags);int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);int epoll_wait(int epfd, struct epoll_event *event

2013-08-02 18:39:00 1930

转载 UNIX网络编程——select函数的并发限制和 poll 函数应用举例

一、用select实现的并发服务器,能达到的并发数,受两方面限制       1、一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。可以通过ulimit -n来调整或者使用setrlimit函数设置, 但一个系统所能打开的最大数也是有限的,跟内存大小有关,可以通过cat /proc/sys/fs/file-max 查看       2、select中的fd_set集合容量的限制(FD_S

2013-08-02 17:54:12 1820

转载 UNIX网络编程——epoll 的accept , read, write(重要)

在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK)。       从字面上看,意思是: EAGAIN: 再试一次 EWOULDBLOCK:如果这是一个阻塞socket, 操作将被block perror输出:Resource temporarily unavailable总结:       这个错误表示

2013-08-02 15:24:24 3819 2

转载 UNIX网络编程——epoll的 et,lt关注点

epoll模型有两种工作模式,ET和LT两种模式下都有一些细节值得注意,以下是一些思考: 一、ET模式下Q1:调用accept时,到底TCP完成队列里有多少个已经建立好的连接?这里又得分情况来说:没有连接。这种情况发生在TCP连接被客户端夭折,即在服务端调用accept之前客户端给出一个RST。该RST导致刚刚建立好的连接从服务器端的TCP完成队列中被移出。源自berkeley的实现会在内核处理该

2013-08-02 14:28:29 2948 1

转载 UNIX网络编程——解决TCP网络传输“粘包”问题

当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API)。TCP/IP传输层有两个并列的协议:TCP和UDP。其中TCP(transport control protocol,传输控制协议)是面向连接的,提供高可靠性服务。UDP(user datagram protocol,用户数据报协议)是无连接的,提供高效率服务。在实际工程应用中,对可靠性和效率的

2013-08-01 19:06:25 1928 1

转载 UNIX网络编程——Socket粘包问题

一、两个简单概念长连接与短连接:1、长连接     Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收。2、短连接     Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点 通讯,比如多个Client连接一个Server。 二 、什么时候需要考虑粘包问题?       如果利用tcp每次发送

2013-08-01 18:28:20 2440

转载 UNIX网络编程——Socket/TCP粘包、多包和少包, 断包

为什么TCP 会粘包        前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个数据包不完整。为什么会这样吗,我们用mina这样通信框架,还会出现这种问题?       TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的

2013-08-01 17:53:32 1951

转载 UNIX网络编程——利用ARP和ICMP协议解释ping命令

一、MTU       以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit)       如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就要进行分片(Fragmentation),把数据报分成若干片,这样每一片都小于MTU。       当网络上

2013-08-01 15:38:02 2425

gdb调试程序

gdb调试

2013-05-29

gdb调试示例

gdb示例

2013-05-29

空空如也

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

TA关注的人

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