--------【Linux高性能网络编程】
文章平均质量分 58
奔跑吧,行者
这个作者很懒,什么都没留下…
展开
-
Linux网络编程--字节序
1 .谈到字节序,那么会有朋友问什么是字节序 很简单:【例如一个16位的整数,由2个字节组成,8位为一字节,有的系统会将高字节放在内存低的地址上,有的则将低字节放在内存高的地址上,所以存在字节序的问题。】2 .那么什么是高字节、低字节? 也相当简单:【一个16进制整数有两个字节组成,例如:0xA9。 高字节就是指16进制数的前8位(权重高的8位),如上例中的A。 低字节就是指16进制数的后8原创 2015-08-25 11:01:03 · 2136 阅读 · 2 评论 -
Linux网络编程--定时器的学习和使用
linux网络编程需要处理的重要事件之一--定时事件,对于服务器而言,管理着众多的客户端连接,高效稳定的管理这些客户端,定时事件是必不可少的,也对服务器的性能有着至关重要的作用。本博文先介绍简单的定时事件,以便于下一篇介绍高性能定时器做铺垫。1.使用setsockopt设置socket选项SO_RCVTIMEO和SO_SNDTIMEO这两个选项分别用来设置socket接收超时时间和发送超时原创 2016-03-10 14:25:52 · 3461 阅读 · 0 评论 -
Linux网络编程--定时器之时间轮
由于基于升序定时器链表的添加定时器效率偏低,所以本博文介绍一种高效的定时器---时间轮;时间轮:包含时间间隔si,时间轮槽数N,运行一周所用的时间是si*N。每一个槽就是一个无序的定时器链表,并且拥有统一的特征,定时时间相差N*si整数倍。时间轮的优势在于采用哈希表的思想,将定时器散列在不同的定时器链表中,这样插入定时器的效率不受定时器数目影响。那么很显然,要提高定时精度,si值越小越原创 2016-03-10 15:29:57 · 2038 阅读 · 0 评论 -
Linux网络编程--定时器之时间堆
相比较时间轮,时间堆的效率更高,主要利用最小堆的思想实现。具体实现过程如下:#ifndef intIME_HEAP#define intIME_HEAP#include #include #include using std::exception;#define BUFFER_SIZE 64class heap_timer;struct client_data{原创 2016-03-10 15:40:58 · 1298 阅读 · 0 评论 -
Linux网络编程--使用epoll模型同时处理tcp和udp服务
在实际工作中,服务器需要同时监听和处理tcp和udp的套接字,同时监听N多的端口。根据bind系统调用来讲,一个socket只能监听一个端口,因此要创建多个socket并绑定到各个端口上。当然同一个端口可以同时绑定tcp和udp的socket,但是要创建两个socket,一个是tcp的一个是udp的。下面我们就写一个可以同时处理tcp和udp服务的回射服务器。#include <sys/types原创 2016-03-22 14:43:47 · 5102 阅读 · 4 评论 -
Linux网络编程--sendfile零拷贝高效率发送文件
本博文介绍使用sendfile函数进行零拷贝发送文件,实现高效数据传输,并对其进行验证。那么什么是sendfile呢?linux系统使用man sendfile,查看sendfile原型如下:#include ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);Sendfile原创 2016-03-11 15:24:11 · 15528 阅读 · 2 评论 -
Linux网络编程--使用epoll,共享内存技术实现高性能的聊天室程序
本篇博文主要介绍使用epoll和多进程的共享内存技术实现高性能的聊天室的服务器程序。#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <assert.h>#include <stdio.h>#include <unistd.h>#include <errno.h>#include <原创 2016-03-28 10:25:49 · 4302 阅读 · 0 评论 -
Linux网络编程--recv函数返回值详解
recv函数int recv( SOCKET s, char FAR *buf, int len, int flags);不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 第三个参数指明buf的长度; 第四个参数一般置0。这里只描述同步S原创 2016-04-13 14:37:50 · 18380 阅读 · 1 评论 -
Linux网络编程--select,poll和epoll的区别
在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select、poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用,现在比较出名的nginx就是使用epoll来实现I/O复用支持高并发,目前在高并 发的场景下,nginx越来越收到欢迎。这里有个文章参考,Ngin原创 2016-04-14 14:53:49 · 1661 阅读 · 0 评论 -
linux中对errno是EINTR的处理
慢系统调用(slow system call):此术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就没有返回的保证。EINTR错误的产生:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。例如:在socke原创 2016-05-18 15:53:24 · 24589 阅读 · 1 评论 -
Linux网络编程--服务端判断客户端断开的经验方法
法一:当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。 法二: struct tcp_info info; int len=sizeof(info); getsock原创 2016-03-07 15:41:36 · 6646 阅读 · 4 评论 -
多进程并发编程----基于高级的预先创建进程池(accept使用线程上锁)的模型
本博文介绍如何使用线程对accept进程加锁保护。使用线程对accept加锁,不仅适用于同一进程内各线程之间的上锁,同样适用于不同进程之间的上锁。实现要点:1 互斥变量必须存放在所有进程共享的内存区域内2 告知线程函数库这是不同进程之间共享的互斥锁服务端程序的代码如下:#include #include #include #include #include原创 2016-04-25 17:56:06 · 1725 阅读 · 0 评论 -
多进程并发编程----基于高级的预先创建进程池(accept使用文件上锁)的模型
本篇博文讲解如何使用fcntl文件上锁的方式对accept进行保护。如果多个进程在引用同一个监听套接字的描述符上调用accept,对于不同的内核accept不一定都是原子操作。Berkeley的内核支持这种模型,而system V就会出现问题,那么我们的解决方法之一就是本博文讲解的使用文件上锁保护accept函数调用,保证任意时刻只有一个进程阻塞在accept,其他进程则阻塞在试图获取用于保护原创 2016-04-25 17:43:45 · 747 阅读 · 0 评论 -
多进程并发编程----基于高级的动态创建进程池的模型
此篇博文主要讲解如何动态创建进程的方法,此方法模型如下:main{ ps=socket(); bind(); listen(); while(1){ cs=accept(); if(cs){ pid=fork(); if(pid==0){//子进程处理 close(ps); do_child(cs); }原创 2016-04-21 18:01:03 · 1016 阅读 · 0 评论 -
多进程并发编程----基于高级的预先创建进程池(accept不上锁)的模型
此篇博文先介绍最简单的服务器并发模型,此模型的大概框架如下:main{socket();bind();listen();for(i=0;ipid=fork();if(pid==0)//子进程do_child();}waitpid();close(fd);}do_child(){while(1){accept();read();wr原创 2016-04-21 16:45:09 · 1119 阅读 · 0 评论 -
libevent---源代码结构
Libevent 的源代码虽然都在一层文件夹下面,但是其代码分类还是相当清晰的,主要可分为头文件、内部使用的头文件、辅助功能函数、日志、libevent 框架、对系统 I/O 多路复用机制的封装、信号管理、定时事件管理、缓冲区管理、基本数据结构和基于 libevent的两个实用库等几个部分,有些部分可能就是一个源文件。 (1)头文件 主要就是 event.h:事件宏定义、接口函数声明,主要原创 2016-03-08 14:49:30 · 873 阅读 · 0 评论 -
libevent---主要函数
event_int(初始化libevent实例)struct event_base *event_init(void)初始化事件处理框架实例,内部调用event_base_new。event_base_new的主要逻辑:代码 1 struct event_base * 2 event_base_new(void) 3 { 4 5 //初始化小根堆原创 2016-03-08 15:10:16 · 1684 阅读 · 0 评论 -
Linux网络编程--epoll模型ET触发模式之epolloneshot事件
epoll模型的ET模式一般来说只触发一次,然而在并发程序中有特殊情况的存在,譬如当epoll_wait已经检测到socket描述符fd1,并通知应用程序处理fd1的数据,那么处理过程中该fd1又有新的数据可读,会唤醒其他线程对fd1进行操作,那么就出现了两个工作线程同时处理fd1的情况,这当然不是我们期望看到的。那么下面我们就介绍epolloneshot事件,此规定操作系统最多触发其上注册的原创 2016-03-21 15:24:22 · 4715 阅读 · 0 评论 -
Linux网络编程--epoll模型之LT触发模式和ET触发模式
epoll对文件描述符有两种操作模式--LT(level trigger电平模式)和ET(edge trigger边缘模式)简单来讲,LT是epoll的默认操作模式,当epoll_wait函数检测到有事件发生并将通知应用程序,而应用程序不一定必须立即进行处理,这样epoll_wait函数再次检测到此事件的时候还会通知应用程序,直到事件被处理。而ET模式,只要epoll_wait函数检测到事原创 2016-03-21 14:38:46 · 4178 阅读 · 1 评论 -
Linux网络编程--字符串IP和二进制IP转换
一:不安全的(不可重入性)inet_xxx()函数族由于计算机理解的IP都是以二进制形式保存的,那么在网络程序设计中经常会需要字符串IP和二进制IP的转换,linux系统有一组要用于网络地址转换的函数,如下: #include #include #include int inet_aton(const char *cp, str原创 2015-08-25 13:45:34 · 1712 阅读 · 0 评论 -
Linux网络编程--TCP网络编程基础(简单的server/client模型)
本文主要讲解C/S模型,对服务器端和客户端的流程和函数的使用进行解析,以及网络编程中对信号的处理,特别是由于连接关闭而产生的SIGPIPE信号和终止进程而产生的SIGINT信号,当然截取信号并进行处理是程序稳定性的基本要求。TCP网络编程中常用的函数主要有:socket(),bind(),listen(),accept(),read(),write(),connect(),close();服务器端原创 2015-08-24 15:25:18 · 3130 阅读 · 0 评论 -
Linux网络编程--文件空间映射mmap函数
/*使用mmap对文件进行操作*/#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/mman.h>/*mmap*/#include <string.h>/*memset warning*/#include <stdio.h>#define FILELENGTH 80int main(vo原创 2015-08-20 11:38:25 · 1834 阅读 · 1 评论 -
Linux网络编程--IO模型基础
IO的方式有阻塞IO、非阻塞IO模型、IO复用、信号驱动、异步IO等,本文以UDP为例大概介绍这几种IO模型的基础知识和原理。 1.阻塞IO 阻塞IO是最通用的IO类型,使用这种模型进行数据接收的时候,在数据没有到之前程序会一直等待。 2.非阻塞IO模型 3.IO复用 4.信号驱动IO模型 5.异步IO模型原创 2015-09-10 16:33:11 · 1905 阅读 · 0 评论 -
Linux网络编程--信号阻塞与屏蔽(block,unblock)
Linux下当向一个进程发出信号时,从信号产生到进程接收该信号并执行相应操作的过程称为信号的等待过程(呃,根据对APUE的理解翻译的)。如果某一个信号没有被进程屏蔽,则我们可以在程序中阻塞进程对该信号所相应的操作。例如一个程序当接收到SIGUSR1信号时会进行一个操作,我们可以利用系统API阻塞(block)程序对该信号的操作,直到我们解除阻止。再举个现实的例子:就好像一个同学让我帮他带饭,但是我现原创 2015-09-10 15:02:10 · 3675 阅读 · 0 评论 -
Linux网络编程--IO函数以及示例
网络数据能够正确到达用户并被用户接收是进行网络数据传输的基本目的, 网络数据的接受和发送有很多种方案,例如:直接发送和接收,通过向量发送和接收,使用消息发送和接收等。本篇文章主要介绍常用的IO函数以及用法,如:最常用的read()/write()函数,和其他标准的套接字专用函数recv()/send(),readv()/writev(),recvmsg()/sendmsg()。 各个函数原型以及介原创 2015-08-28 16:32:04 · 1625 阅读 · 0 评论 -
Linux网络编程--协议的名称以及类型等处理
为了网络编程的便捷,系统提供了一组用于查询协议的值以及名称的函数,本篇文章主要介绍协议族函数的使用方法和注意事项。 下面用一段代码介绍函数的使用方法:#include <netdb.h>#include <stdio.h> /* 显示协议的项目 */void display_protocol(struct protoent *pt){ int i = 0; if(pt){原创 2015-08-27 15:29:52 · 2825 阅读 · 0 评论 -
Linux网络编程--IP地址与域名解析(DNS)
在日常生活中,人们往往知道主机的域名而不知道主机的IP地址,而socket的API均基于IP地址,所以需要使用DNS域名解析服务器进行解析。 那么首先简单介绍一下DNS的原理,DNS服务器系统是按树形的结构构造,顶级域名服务器下分多个二级域名服务器,二级域名服务器下面又分多个下级域名服务器,每个服务器都下辖了一些主机,如图所示: 那么一个主机是如何查询一个域名的IP地址呢?首先需要想本地的域原创 2015-08-27 12:00:58 · 9770 阅读 · 0 评论 -
Linux网络编程--自定义套接字描述符判定函数issockettype
套接字描述符和通用文件描述符在形式上没有区别,那么如何判断一个文件描述符是否是套接字描述符呢?下面我们就简单的自定义一个函数issockettype,用于套接字描述符判定。#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <stdio.h>#include <sys/types.h>#include原创 2015-08-27 10:44:47 · 1628 阅读 · 0 评论 -
Linux网络编程--获取文件状态信息fstat函数
/*使用stat获得文件的状态*/#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int main(void){ struct stat st; if( -1 == stat("test.txt", &st)){ printf("获得文件状态失败\n"); return -1; }原创 2015-08-20 13:16:13 · 2052 阅读 · 0 评论 -
Linux网络编程--文件属性fcntl函数
/*使用fcntl控制文件符*/#include <unistd.h>#include <fcntl.h>#include <stdio.h>int main(void){ int flags = -1; int accmode = -1; /*获得标准输入的状态的状态*/ flags = fcntl(0, F_GETFL, 0); if( flags <原创 2015-08-20 12:56:05 · 2047 阅读 · 0 评论 -
Linux网络编程--字符串IP和二进制IP转换
一:不安全的(不可重入性)inet_xxx()函数族由于计算机理解的IP都是以二进制形式保存的,那么在网络程序设计中经常会需要字符串IP和二进制IP的转换,linux系统有一组要用于网络地址转换的函数,如下: #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>原创 2015-08-25 14:02:50 · 9310 阅读 · 0 评论 -
Linux网络编程--poll()和ppoll()函数
poll()函数 ppoll()函数原创 2015-09-11 10:48:16 · 9272 阅读 · 0 评论 -
Linux网络编程--非阻塞编程
非阻塞方式程序设计介绍非阻塞方式的操作与阻塞方式的操作最大的不同点是函数的调用立刻返回,不管数据是否成功读取或者成功写入。使用fcntl()将套接字文件描述符按照如下的代码进行设置后,可以进行非阻塞的编程: fcntl(s, F_SETFL, O_NONBLOCK); 其中的s是套接字文件描述符,使用F_SETFL命令将套接字s设置为非阻塞方式后,再进行读写操作就可以马上返回了。非阻塞程序设计的原创 2015-09-11 11:24:48 · 2665 阅读 · 1 评论 -
Linux网络编程--select()和pselect()函数
函数select()和pselect()用于IO复用,它们监视多个文件描述符的集合,判断是否有符合条件的时间发生。 1.select()函数 函数select()与之前的recv()和send()直接操作文件描述符不同。使用select()函数可以先对需要操作的文件描述符进行查询,查看是否目标文件描述符可以进行读、写或者错误操作,然后当文件描述符满足操作的条件的时候才进行真正的IO操作。 se原创 2015-09-10 17:14:44 · 12652 阅读 · 2 评论 -
Linux网络编程--epoll 模型原理详解以及实例
1.简介Linux I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。Linux 2.6内核中有提高网络I/O性能的新方法,即epoll 。 epoll是什么?按照man手册的说法是为处理大批量句柄而作了改进的poll。要使用epoll只需要以下的三个系统函数调用: epoll_create(2),epoll_ctl(2),epoll_wait(2)。原创 2015-10-08 16:53:46 · 13115 阅读 · 3 评论 -
libevent---socket异步编程
libevent的使用 -- socket异步编程这篇文章介绍下libevent在socket异步编程中的应用。在一些对性能要求较高的网络应用程序中,为了防止程序阻塞在socket I/O操作上造成程序性能的下降,需要使用异步编程,即程序准备好读写的函数(或接口)并向系统注册,然后在需要的时候只向系统提交读写的请求之后就继续做自己的事情,实际的读写操作由系统在合适的时候调用我们程序注册的原创 2016-03-04 15:34:18 · 1082 阅读 · 0 评论