自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

未来之歌

保持善良,善待他人就是善待自己。

  • 博客(33)
  • 收藏
  • 关注

转载 C++中explicit关键字的作用

转自:http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.htmlexplicitexplicit用来防止由构造函数定义的隐式转换。要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。 例如:class Things{public: Things(const st

2016-02-26 22:35:24 1602

原创 static_cast、const_cast用法

static_cast 用法用法static_cast < type-id > ( expression )说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。来源:为什么需要static_cast强制转换?情况1:void指针->其他类型指针情况2:改变通常的标准转换情况3:避免出现可能多种转换的歧义它主要有如下几种用法: •用于类层次

2016-02-25 23:34:41 12999

转载 引用作为函数返回值的好处及使用

转自:http://blog.csdn.net/zhongguoren666/article/details/8523458 对程序有所完善与修改说明: (1)以引用返回函数值,定义函数时需要在函数名前加& (2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。 例如:#include <iostream>float temp; //定义全局变量tempfloat fn1(

2016-02-25 21:52:03 2910

原创 C++命名空间的使用实践

大型程序往往是由团队开发的,即使是个人编写的程序,随着代码量的增多,变量、函数、类的名字冲突的现象时有发生。有的情况下,编译器会指明错误所在,但有时候会发生一些察觉不到的覆盖,让程序员对出现的错误摸不着头脑。 很多厂商也提供了快捷的第3方类库,用户不用关心库中的类是如何实现的,知道如何调用接口使用即可,但多个厂商定义的变量、函数和类的名字可能会发生冲突,同样是初始化操作,甲公司类库提供了initia

2016-02-24 13:33:08 531

原创 git版本控制工具学习笔记

git基本命令git add file 提交文件 git commit -m "what changes" 提交更改信息注释git status 查看修改状态git log 查看日志git log --pretty=oneline 一行显示日志信息git reset --hard HEAD^ 版本回退到上一个版本git reset --hard xxxx(某版本号前几位) 回退到xxxx版本gi

2016-02-23 17:09:01 502

原创 多线程并发C/S基本通信模型及实现

本例实现如下功能: 服务端接收来自客户端发送过来的字符串,将小写转换为大写后发送回客户端。 其中,每一个新客户端连接后,服务端主进程为此客户端创建一个线程进行数据的处理。多线程并发服务端:/*server.c*/#include <stdio.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#inclu

2016-02-20 15:18:08 2262

原创 多进程并发C/S通信基本模型及实现

本例实现如下功能: 服务端接收来自不能客户端发送过来的字符串,将小写转换为大写后发送回客户端。 其中,每一个新客户端连接后,服务端主进程为此客户端创建一个子进程进行数据的处理。多进程并发服务端代码:/*server.c*/#include <stdio.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#

2016-02-19 21:20:41 1960

原创 Linux网络编程 -- socketpair的使用

socketpair的使用Linux实现了一个源自BSD的socketpair调用,可以实现在同一个文件描述符中进行读写的功能。 该系统调用能创建一对已连接的UNIX族socket。 在Linux中,完全可以把这一对socket当成pipe返回的文件描述符一样使用,唯一的区别就是这一对文件描述符中的任何一个都可读和可写,函数原型如下:#include <sys/types.h>#include

2016-02-18 10:49:52 12898 1

原创 socket编程 -- epoll模型服务端/客户端通信的实现

本例实现如下功能: 支持多客户端与一个服务端进行通信,客户端给服务端发送字符串数据,服务端将字符串中小写转为大写后发送回客户端,客户端打印输出经转换后的字符串。 例如:发送abcde,打印输出ABCDE 服务端源码如下:/*server.c*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <netine

2016-02-17 14:43:45 5646

原创 网络地址格式及域名地址转化

网络地址格式转化通常用户在表达地址时采用的是点分十进制表示的数值(或者是为冒号分开的十进制Ipv6地址),而在通常使用的socket编程中使用的则是32位的网络字节序的二进制值,这就需要将这两个数值进行转换。这里在Ipv4中用到的函数有inet_aton()、inet_addr()和inet_ntoa(),而IPV4和Ipv6兼容的函数有inet_pton()和inet_ntop()。 I

2016-02-14 15:40:27 4468

原创 socket编程 -- 大端小端区别及转换

计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。内存的低地址存储数据的低字节,高地址存储数据的高字节的方式叫小端模式。内存的高地址存储数据的低字节,低地址存储数据高字节的方式称为大端模式。例子:对于内存中存放的数0x12345678来说 如果是采用大端模式存放的,则其真实的数是:0x12345678 如果是采用小端模式存放的,则其真实的数是:0x78

2016-02-13 23:40:53 5852

原创 socket编程 -- 基于UDP协议的C/S通信模型及实现

UDP服务端/客户端通信的基本模型由于UDP不需要维护连接,程序逻辑简单了很多。 但是UDP协议是不可靠的,实际上有很 多保证通讯可靠性的机制需要在应用层实现。基于UDP协议的客户端/服务端通信的实现服务端 接收来自客户端的字符串,将小写字母转为大写字符后发送给客户端服务端源码server.c/*server.c*/#include <stdio.h>#include <stdlib.h>

2016-02-13 20:56:51 4039

原创 socket编程 -- 基于TCP协议的C/S通信模型及实现

基于TCP协议的客户端/服务器的程序下图是基于TCP协议的客户端/服务器程序的一般流程服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到

2016-02-12 23:47:28 7646

原创 socket编程 -- socket、bind、accept、connect函数

socketsocket函数原型#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int socket(int domain, int type, int protocol);参数说明domain: AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地址 AF_INET6 与上面

2016-02-12 19:40:51 16472

原创 socket编程 -- 网络字节序、IP地址转换、sockaddr数据结构

网络字节序内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的 多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢?发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据

2016-02-12 15:42:16 3677

原创 TCP流量控制

如果发送端发送的速度较快,接收端接收到数据后处理的速度较慢,而接收缓冲区的大小是固定的,就会丢失数据。TCP协议通过“滑动窗口(Sliding Window)”机制解决这一问题。滑动窗口 发送端发起连接,声明最大段尺寸是1460,初始序号是0,窗口大小是4K,表示“我的接收缓冲区还有4K字节空闲,你发的数据不要超过4K”。接收端应答连接请求,声明最大段尺寸是1024,初始序号是8000,窗口大小是6

2016-02-12 11:01:22 518

原创 TCP状态转换

TCP建立连接协议与终止连接协议过程建立连接协议(三次握手)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。客户必须再次回应服务段一个ACK报文,这是报文段3。连接终止协议(四次

2016-02-12 10:44:06 354

原创 协议格式

数据包封装传输层及其以下的机制由内核提供,应用层由用户进程提供,应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报

2016-02-12 00:08:33 2051

原创 Linux网络编程 -- 网络模型与通信过程

OSI七层模型物理层 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。 它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。 这一层的数据叫做比特。数据链路层 定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。 这一层通常还提供错误检测和纠正,以确保数据的可靠

2016-02-11 22:19:12 994

原创 Linux进程共享通信 -- mmap实现

使用mmap内存映射实现一端写,另一端读的进程间通信写端代码write.c/*write.c*/#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/mman.h>/*映射内存大

2016-02-11 17:54:19 589

原创 Linux进程间通信 -- mmap函数的使用

mmap/munmap函数函数原型#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);int munmap(void *addr, size_t length);函数功能 mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应

2016-02-11 15:29:53 1021

原创 Linux进程 -- wait/waitpid函数

僵尸进程: 子进程退出,父进程没有回收子进程资源(PCB),则子进程变成僵尸进程。 孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为1号进程init进程。wait/waitpid函数函数原型:#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *status);pid_t waitpid(pid_t pi

2016-02-11 00:27:01 1912

原创 Linux进程 -- exec函数操作

exec系列函数用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。 调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。以exec开头的函数,统称exec函数:#include <unistd.h>i

2016-02-10 23:07:25 4773 3

原创 Linux进程 -- fork操作

fork函数#include <unistd.h>pid_t fork(void);功能:子进程复制父进程的0到3G空间和父进程中的PCB,但是id号不同。特点:调用一次,返回两次。父进程中返回子进程ID子进程中返回0读时共享,写时复制fork示例:#include <sys/types.h>#include <unistd.h>#include <stdio.h>#include

2016-02-10 21:41:25 1477

原创 Linux目录遍历实现 -- 列出当前目录下所有文件

递归遍历目录,列出目录中的文件,代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <dirent.h>#include <sys/types.h>#include <sys/stat.h>#define MAX_PATH 512 //最大文件长度定义为512voi

2016-02-06 22:02:26 13286 4

原创 Linux文件属性设置 -- fcntl函数

fcntl功能用fcntl函数改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞等标志(这 些标志称为File Status Flag),而不必重新open文件。#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);int fcntl(

2016-02-06 14:57:38 1005

原创 Linux文件操作 -- lseek实践

注:学习资料来自邢文鹏老师lseek每个打开的文件都记录着当前读写位置,打开文件时读写位置是0,表示文件开头,通常读写多少个字节就会将读写位置往后移多少个字节。但是有一个例外,如果以O_APPEND方式打开,每次写操作都会在文件末尾追加数据,然后将读写位置移到新的文件末尾。 lseek和标准I/O库的fseek函数类似,可以移动当前读写位置(或者叫偏移量)。#include <sys/types.

2016-02-06 14:16:25 3867

原创 Linux文件复制cp命令的实现

Linux命令cp的实现 代码如下:#include <stdio.h>#include <sys/types.h>#include <fcntl.h>#include <stdlib.h>#include <unistd.h>#define SIZE 8192int main(int argc, char *argv[]){ char buf[SIZE]; int fd

2016-02-06 11:12:13 1396

原创 Linux 文件I/O — 文件描述符详解

注:学习资源来自邢文鹏老师文件描述符一个进程默认打开3个文件描述符STDIN_FILENO 0STDOUT_FILENO 1STDERR_FILENO 2新打开文件返回文件描述符表中未使用的最小文件描述符。open函数可以打开或创建一个文件。#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const

2016-02-05 23:34:14 2047

原创 Linux多线程—条件变量

非程序部分转载自:http://www.cnblogs.com/feisky/archive/2010/03/08/1680950.html条件变量简述与互斥锁不同,条件变量是用来等待而不是用来上锁的。 条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。 通常条件变量和互斥锁同时使用。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动

2016-02-03 00:17:51 461

原创 pthread_cleanup_push()/pop()线程终止清理

pthread_cleanup_push()和pthread_cleanup_pop()线程为了访问临界共享资源而为其加上锁,但在访问过程中该线程被外界取消,或者发生了中断,则该临界资源将永远处于锁定状态得不到释放。外界取消操作是不可预见的,因此的确需要一个机制来简化用于资源释放的编程。在POSIX线程API中提供了一个pthread_cleanup_push()/pthread_cleanup_p

2016-02-01 22:07:34 1130

转载 usleep和sleep的区别

转自:http://www.linuxidc.com/Linux/2013-03/81455.htmsleep头文件: #include <windows.h> // 在VC中使用带上头文件#include <unistd.h> // 在gcc编译器中,使用的头文件因gcc版本的不同而不同功 能: 执行挂起指定的秒数 语 法: unsigned sleep(unsigned second

2016-02-01 19:59:29 932

原创 Linux线程 -- 互斥锁实践

Linux线程互斥锁程序示例#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>#define NUM 5000 int counter = 0;/*静态锁*/pthread_mutex_t c_mutex = PTHREAD_MUTEX_INITIALIZER;/*线程执行函数*/voi

2016-02-01 19:36:38 438

空空如也

空空如也

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

TA关注的人

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