精华内容
下载资源
问答
  • 一个 Go 服务器框架。 它旨在忽略开发人员的网络细节。
  • acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...
  • shineframe:高性能超轻量级C ++开发库及服务器编程框架
  • 一、服务器编程框架 模块 单个服务器程序 服务器机群 I/O处理单元 处理客户连接,读写网络数据 作为接入服务器,实现负载均衡 逻辑单元 业务进程或线程 逻辑服务器 网络存储单元 本地...

     

    一、服务器编程框架

    模块单个服务器程序服务器机群
    I/O处理单元处理客户连接,读写网络数据作为接入服务器,实现负载均衡
    逻辑单元业务进程或线程逻辑服务器
    网络存储单元本地数据库 、文件或缓存数据库服务器
    请求队列各单元之间的通信方式各服务器之间的永久TCP连接

            I/O处理单元是服务器管理客户连接的模块。主要完成以下工作:等待并接受新的客户连接,接受客户数据,将服务器响应数据返回给客户端。但是,数据的收发不一定在I/O处理单元中执行,也可能在逻辑单元中执行,具体在何处执行取决于事件处理模式。对于一个服务器机群来说,它实现负载均衡,从所有逻辑服务器中选取负荷最小的一台来为新客户服务。

            一个逻辑单元通常是一个线程或者进程。它分析并处理客户数据,然后将结果传递给I/O处理单元或者直接发送给客户端。对服务器机群而言,一个逻辑单元本身是一台逻辑服务器。服务器通常拥有多个逻辑单元,以实现对多个客户任务的并行处理。

    网络存储单元可以使数据库、缓存和文件,甚至是一台独立的服务器。但它不是必须的,比如ssh、telnet等登录服务就不需要这个单元。

           请求队列是各单元之间的通信方式的抽象。I/O处理单元收到客户请求时,需要以某种方式通知一个逻辑单元来处理该请求。同样,多个逻辑单元同时访问同一个存储单元时,也需要采用某种机制来协调处理竞态条件。请求队列通常实现为池的一部分。

    二、I/O模型

    1.阻塞I/O和非阻塞I/O

            阻塞I/O执行的系统调用可能因为无法立即完成而被操作系统挂起,直到等待的事件发生为止。非阻塞I/O执行的系统调用总是立即返回,而不管事件是否已经发生,如果事件没有立即发生则返回-1,和出错情况一样,此时可根据errno来区分这两种情况。对accept/send和recv而言,事件未发生时errno通常被设置为EAGAIN或者EWOULDBLOCK;对于connect而言,errno则被设置成EINPROGRESS。非阻塞I/O一般和I/O通知机制一起使用,如I/O复用和SIGIO信号。

    2.I/O复用

           I/O复用是最常使用的I/O通知机制,指定是应用程序通过I/O复用函数向内核注册一组事件,内核通过I/O复用函数把其中就绪的事件通知给应用程序。Linux上常用的I/O复用函数是select、poll和epoll_wait。I/O复用函数本身是阻塞的,它们能提高程序效率的原因在于它们具有同时监听多个I/O事件的能力。

    3.四种I/O模型

           阻塞I/O、I/O复用、信号驱动I/O这三者都是同步I/O模型。

    I/O模型读写操作和阻塞阶段
    阻塞I/O程序阻塞与读写函数
    I/O复用程序阻塞与I/O复用系统调用,但可同时监听多个I/O事件。对I/O本身的读写操作是非阻塞的
    SIGIO信号·信号触发读写就绪事件,用户程序执行读写操作,程序没有阻塞阶段
    异步I/O内核执行读写操作并触发读写完成事件。程序没有阻塞阶段

    三、两种高效的事件处理模式

          服务器程序通常要处理三类事件:I/O事件、信号和定时事件。两种高效的事件处理模式:Reactor和Proactor。一般地,同步I/O模型常用于实现Reactor模式,异步I/O模型则用于实现Proactor模式。

    1.Reactor模式

            Reactor是一种这样的模式,它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程(逻辑单元)。除此之外,主线程不作任何其他实质性工作。读写数据,接收新的连接,以及处理客户请求均在工作线程完成。

           使用同步I/O模型(以epoll_wait为例)实现的Reactor模式的工作流程是:

           (1)主线程往epoll内核事件表中注册socket读就绪事件;

           (2)主线程调用epoll_wait等待socket上有数据可读;

           (3)当socket上有数据可读时,epoll_wait通知主线程。主线程则将socket可读事件放入请求队列;

          (4)睡眠在请求队列上的某个工作线程被唤醒,它从socket读取数据,并处理客户请求,然后往epoll内核事件表中注册该socket上的写就绪事件;

            (5)主线程调用epoll_wait等待socket可写;

           (6)当socket可写时,epoll_wait通知主线程,主线程将socket可写事件放入请求队列;

           (7)睡眠在请求队列上的某个工作线程被唤醒,它往socket上写入服务器处理客户请求的结果。

    2.Proactor模式

             Proactor模式将所有I/O操作都交给主线程和内核来处理,工作线程仅负责业务逻辑。

            使用异步I/O模型(以aio_read和aio_write为例)实现的Proactor模式工作流程是:

            (1)主线程调用aio_read函数想内核注册socket上读完成事件,并告诉内核用户读缓冲区的位置,以及读操作完成时如何通知应用程序;

            (2)主线程继续处理其他逻辑;

            (3)当socket上的数据被读入用户缓冲区后,内核将向应用程序发送一个信号,以通知应用程序数据已经可用;

            (4)应用程序预先定义好的处理函数选择一个工作线程来处理客户请求。工作线程处理完客户请求以后,调用aio_write函数想内核注册socket上的写完成事件,并告诉内核用户写缓冲区的位置,以及写操作完成时如何通知应用程序;

            (5)主线程继续处理其他逻辑;

            (6)当用户缓冲区的数据被写入socket之后,内核将向应用程序发送一个信号,以通知应用程序数据已经发送完毕;

            (7)应用程序预先定义好的信号处理函数选择一个工作线程来做善后处理,比如决定是否关闭socket.

    3.两者的区别

            Reactor模式适用于耗时短的处理场景,同时接受多个服务请求,并且一次同步的处理它们的事件驱动程序。

            Proactor则适用于耗时长的处理场景,异步接受和同时处理多个服务器请求的事件驱动程序。

    四、两种高效的并发模式

             并发编程的目的是让程序“同时”执行多个任务。而并发模式是指I/O处理单元和多个逻辑单元之间协调完成任务的方法。

    1.半同步/半异步模式

            同步是指程序完全按照代码序列的顺序执行;异步是指程序的执行需要有系统事件来驱动,常见的系统事件包括中断、信号等。

            一种高效的半同步/半异步模式是指,主线程只管理监听socket,连接socket由工作线程来管理。主线程是异步的,工作线程也是异步的,这不是严格意义上的半同步/半异步.

     

    2.领导者/追随者模式

            领导者/追随者模式是多个工作线程轮流获得事件源集合,轮流监听、分发并处理时间的一种模式。在任意时间点,程序都仅有一个领导者,它负责监听I/O事件,而其他线程则都是追随者,他们休眠在线程池中等待称为新的领导者。当前的领导者如果检测到I/O事件,首先要冲线程池中推选出新的领导者线程,然后处理I/O事件。此时,新的领导者等待新的I/O事件,而原来的领导者则处理I/O事件,二者实现了并发。

    五、提高服务器性能的其他建议

            高性能服务器要注意的几个方面:池、数据复制、上下文切换和锁。

    1.池

        池是一组资源的集合,这组资源在服务器启动之初就完全被创建好并初始化,这称为静态资源分配。当拂去其正式运行阶段,即开始处理客户请求的时候,如果需要相关资源,则可以直接从池中获取,无需动态分配。因为直接从池中获取资源比动态分配资源的速度要快的多,因为分配系统资源的系统调用都是很耗时的,涉及到用户态和内核态的来回切换。当服务器处理完一个客户连接以后,可以把相关资源放回池中,无需执行系统调用来释放资源。

            常见的池有内存池、进程池、线程池和连接池。

    (1)内存池

            内存池通常用于socket的接收缓冲和发送缓冲。内存池的大小可以根据情况进行分配,一种是预先分配好固定的内存池大小,另一种是根据情况动态扩大接收缓冲区。

    (2)进程池/线程池

            进程池和线程池都是用于并发的手段,当我们需要一个工作进程或工作线程来处理新到来的客户请求时,我们可以直接从进程的池或线程池中取得一个执行实体,而无须动态调用fork或pthread_create等函数来创建进程和线程。

    (3)连接池

            连接池通常用于服务器或服务器机群的内部永久连接。如每个逻辑单元都可能需要频繁访问本地的某个数据库。简单做法是:逻辑单元每次需要访问数据库的时候,就像数据库程序发起连接,而访问完毕后释放连接。这种做法效率太低。一种解决方案是使用连接池。连接池是服务器预先和数据库程序建立的一组连接的集合。当某个逻辑单元需要访问数据库时,它可以直接从连接池中取得一个连接的实体并使用之。待完成后再返回给连接池。

    2.数据复制

            尽量使用“零拷贝”函数,如sendfile()、tee()等,从而避免数据在用户空间和内核空间的来回拷贝,提高效率。

    3.上下文切换和锁

            不管是多进程还是多线程,数量都不应该太多,否则可能出现进程间或线程间切换占用大量的CPU时间,从而降低效率。

           并发程序中考虑的另外一个问题是共享资源的加锁保护,加的锁应粒度尽可能的小。

     

    补充:socket的基础API中,可能被阻塞的系统调用包括accept、send、recv和connect.

    展开全文
  • 主要包括网络通信库以及服务器框架库等功能
  • 6服务器编程核心要素、原理机制、工具框架等多角度全面阐述编写高性能 linux 服务器的方法
  • 客户端服务器编程模型: 客户端代码: #include #include #include #include #include #include #include #include #include #include #define MAXLINE 100; #define RIO_BUFSIZE 8192; int main()...

    客户端服务器编程模型:

    客户端代码:
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <unistd.h>
    #include <netdb.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <arpa/inet.h>
    #define MAXLINE 100;
    #define RIO_BUFSIZE 8192;
    
    
    int main()
    {
    
    int clientfd = socket(AF_INET,SOCK_STREAM,0);  
    //创建一个客户端套接字描述符
    
    struct sockaddr_in serveraddr;
    struct hostent *hp;
    bzero((char *)&serveraddr,sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(15636);
    serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    //创建服务器套接字
    
    connect(clientfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
    //将客户端套接字描述符与服务器套接字进行连接
    printf("connected.\n");
    char buf[100];
    //定义发送数据缓冲区 while(1){
    printf("please input string:\n");
    fgets(buf,100,stdin);
    //从键盘输入字符串
    send(clientfd,buf,100,0);
    //将位于buf缓冲区的数据发送到clientfd描述符连接的套接字的IP地址对应的线程
    recv(clientfd,buf,100,0);
    //从clientfd关联的服务器端进程获得数据。并保存在缓冲区中
    printf("%s\n",buf);
    }
    
    
    close(clientfd);
    return EXIT_SUCCESS;
    }

    服务器端代码:

    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <unistd.h>
    #include <netdb.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <arpa/inet.h>
    int main()
    {
    
    int port=15636 ;
    int listenfd = socket(AF_INET, SOCK_STREAM,0);
    //创建服务器端套接字描述符,用于监听客户端请求
    struct hostent *hp;
    struct sockaddr_in serveraddr;
    bzero((char *)&serveraddr,sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons(port);
    //创建用于服务的服务器端套接字,注意与 客户端创建的套接字的区别  IP段里,这里是可以为任何IP提供服务的,客户端里的IP是请求的端点
    
    bind(listenfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
    //将服务器端的套接字描述符和服务器端套接字相关联
    
    listen(listenfd,1024);
    //打开监听
    char temp[100];
    struct sockaddr_in clientaddr;
    int clientlen, connfd;
    clientlen = sizeof(clientaddr);
    connfd = accept(listenfd,(struct sockaddr *)&clientaddr, &clientlen);
    //等待接受客户端的请求,这是一个阻塞函数。若成功接受客户端请求则返回新的套接字描述符,这个描述符用于 send和recv函数
    while(1){
    
    recv(connfd,temp,100,0);
    printf("%s\n",temp);
    fgets(temp,100,stdin);
    send(connfd,temp,100,0);
    }
    //recv接收客户端发送过来的字符串,send发送给客户端字符串
     EXIT_SUCCESS;
    }

    注意:以上代码只是为了突出客户端服务器编程框架,因为并未判断出错及相关处理方法。

    下面为完整代码:

    客户端:

    //the client code
    //copyright  chenglibin  http://blog.csdn.net/chenglibin1988
    #include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <netdb.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/types.h>#include <arpa/inet.h>#define MAXLINE 100;int main(){int clientfd = socket(AF_INET,SOCK_STREAM,0);if(clientfd < 0){ perror("socket"); exit(1);}struct sockaddr_in serveraddr;struct hostent *hp;bzero((char *)&serveraddr,sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(15636);
    serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    if(connect(clientfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){
            perror("connect");
            exit(1);
    }

    printf("connected\n");
    char buf[100];
    int idata;
    while(1){
    idata = 0;
    printf("input a string:\n");
    fgets(buf,100,stdin);
    send(clientfd,buf,100,0);
    idata = recv(clientfd,buf,100,0);
    if(idata < 0){
            perror("recv");
            exit(1);
    }

    printf("data received from server is:\n %s\n",buf);
    }

    close(clientfd);
    return EXIT_SUCCESS;
    }
    
    

    
    

    ***************************************************************************************************************************************************************************************

    ***************************************************************************************************************************************************************************************

    服务器端代码如下:

    //the server code
    //copyright  chenglibin  http://blog.csdn.net/chenglibin1988
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <unistd.h>
    #include <netdb.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <arpa/inet.h>
    #define PORT 15636
    int main()
    {
    
    int listenfd = socket(AF_INET, SOCK_STREAM,0);
    if(listenfd < 0){
            perror("socket");
            exit(1);
    }
    
    struct hostent *hp;
    struct sockaddr_in serveraddr;
    bzero((char *)&serveraddr,sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons(PORT);
    
    if(bind(listenfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){
            perror("connect");
            exit(1);
    }
    
    if(listen(listenfd,1024) < 0){
            perror("listen error");
            exit(1);
    }
    
    char temp[100];
    struct sockaddr_in clientaddr;
    int clientlen, connfd;
    clientlen = sizeof(clientaddr);
    
    connfd = accept(listenfd,(struct sockaddr *)&clientaddr, &clientlen);
    if(connfd < 0){
            perror("accept error");
            exit(1);
    }
    
    printf("Accepted!\n");
    
    int idata;
    while(1){
    idata = 0;
    idata = recv(connfd,temp,100,0);
    if(idata < 0){
    perror("recv error");
    exit(1);
    }
    printf("data received from client is :\n%s\n",temp);
    
    printf("input a string:\n");
    fgets(temp,100,stdin);
    send(connfd,temp,100,0);
    }
    EXIT_SUCCESS;
    }
    



    展开全文
  • 《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、技巧和思想...
  • 本书是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、技巧和思想。不仅理论全面、深入...
  • acl 工程从发布至今已经有近10年历史,已经被一些大公司的重要项目所使用,该工程提供了跨平台(LINUX, FreeBSD, ...另外,acl 库中的网络服务器框架是 acl 中最为重要的模块(其来源于著名的Postfix,由其中的 master

    一、描述

    acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、ICMP、memcache、beanstalk),常见流式编解码库:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 etc。

    1.1、库组成

    本工程主要包含 5 个库及大量示例。5 个库的说明如下:

    • 1) lib_acl: 该库是最基础的库,其它 4 个库均依赖于该库; 该库以 C 语言实现。
    • 2) lib_protocol: 该库主要实现了 http 协议及 icmp/ping 协议; 该库以 C 语言实现。
    • 3) lib_acl_cpp: 该库用 C++ 语言封装了 lib_acl/lib_protocol 两个库,同时增加了一些其它有价值的功能应用。
    • 4) lib_dict: 该库主要实现了 KEY-VALUE 的字典式存储库,该库另外还依赖于 BDB, CDB 以及 tokyocabinet 库。
    • 5) lib_tls: 该库封装了 openssl 库,使 lib_acl 的通信模式可以支持 ssl。

    1.2、功能模块组成

    1.2.1、网络通信库

    • 流处理模块(ACL_VSTREAM): 该模块是整个 acl 网络通信最基础的流式通信模块,不仅支持网络流,同时还支持文件流,主要支持:
    • 1 按行读数据,兼容 win32 下的 \r\n,同时兼容 UNIX 下的 \n 的结束符
    • 2 按行读数据但要求自动去掉尾部的 \n 或 \r\n
    • 3 以字符串为分隔符读取数据
    • 4 读规定长度的数据
    • 5 尝试性读一行数据或尝试性读规定长度数据
    • 6 探测网络 IO 状态
    • 7 写入一行数据
    • 8 按格式符写入数据,类似于 fprintf
    • 9 文件流定位操作,类似于 fseek
    • 10 一次性写入一组数据,类似于 unix 下的 writev
    • 11 将文件截短,类似于 ftrunk
    • 12 获取文件大小
    • 13 获得当前文件流指针位置,类似于 ftell
    • 14 获得文件尺寸
    • 15 获得网络流的本地地址及远程地址

    • 网络操作模块:该模块主要支持网络服务端监听(支持 TCP/UDP/UNIX 域套接口)、网络客户端连接(支持 TCP/UNIX 域套接口)、DNS 域名查询及结果缓存(支持调用系统 gethostbyname 函数和直接发送 DNS 协议两种方式)、套接口(socket)操作及取本机网卡等功能。

    • 非阻塞网络流:支持非阻塞方式连接、读(按行读,规定长度读)、写(写行,写规定长度,写一组数据)等操作。

    • 常见网络应用协议库(lib_protocol/lib_acl_cpp):主要支持常见网络应用协议,诸如:HTTP、SMTP、ICMP,其中 HTTP、ICMP 两个模块实现了阻塞、非阻塞两种通信方式;此外,HTTP 协议在C++版的 lib_acl_cpp 中还支持服务端、客户端两种通信方式,当作为服务端使用时,支持类似于 JAVA HttpServlet 的接口使用方式,当作为客户端方式使用时,支持连接池与集群管理方式,该模块同时支持 cookie、session、HTTP MIME 文件上传、分块传输、字符集自动转换、自动解压缩、断点续传等丰富的功能。

    • 常见网络通信库:支持 memcached、beanstalk、handler socket 客户端通信库,该通信库支持连接池方式。

    1.2.2、网络 IO 事件引擎

    支持 select(UNIX/LINUX/WIN32)、poll(UNIX/LINUX)、epoll(LINUX)、kqueue(BSD)、devpoll(solaris)、iocp(WIN32)、窗口消息(WIN32) 等系统事件引擎,同时支持 Reactor 及 Proactor 两种编程模型。

    1.2.3、网络服务器框架

    该模块是 acl 中最为重要的模块,提供了服务器编程中常用的基础设施,该服务器框架来源于著名的 Postfix,在其基础上进行了诸多扩展,目前已经支持的主要服务模型有:

    • 1 多进程模型:一个连接一个进程,这种模型的优点是编程简单、安全稳定,缺点是并发度不高;
    • 2 多进程多线程模型:每个子进程是由线程池中的一组线程处理所有的客户端连接,采用 IO 事件触发方式,只有当连接有数据可读时才会将连接与一个线程进行绑定,线程处理完后立即归还给线程池,这种模型的最大优点是可以用少量的线程便可以处理大量的客户端连接,而且编程比较简单(相对于非阻塞模型);
    • 3 多进程非阻塞模型:每个子进程是由一个单独的非阻塞线程组成,该线程采用完全非阻塞 IO 方式处理外来的大量客户端连接(类似于 nginx/squid/ircd),该模型的优点是处理效率高占用资源少,可以处理大量客户端连接,缺点是编程比较复杂;
    • 4 UDP 通信模型:该模型主要为了支持 UDP 网络过程而增加的服务模型;
    • 5 解发器模型:该模型的实例主要用来处理一些定时任务的后台服务过程(类似于系统的 crontab)。

    服务器框架中的子进程实用采用半驻留服务模型,支持子进程预启动机制、最大最小进程数控制、子进程异常报警、单一进程监听多个地址(可同时监听TCP/UDP套接字以及 UNIX 域套接字)、子进程安全控制、日志输出至 syslog-ng、多进程TCP连接均匀化;采用配置文件驱动方式,每个服务一个配置文件,方便进程管理及服务进程在线升级。

    1.2.4、常用数据结构模块

    该模块提供了常见的哈希表(及多种哈希算法)、动态数组、双向链表、平衡二叉树、队列、二分块查找树、256 叉匹配树等数组结构;提供了统一的数据结构遍历方法(采用 acl_foreach)。

    1.2.5、 内存操作模块

    该模块提供三种内存池模型:

    • 1 基本的内存方式:内部封装了系统的 malloc/free API,提供了内存校验等安全措施;该方式同时提供外部注册接口,允许使用者注册自己的内存分配模型;
    • 2 内存片(slab) 方式:根据不同的尺寸大小分配多个定长内存链,可以有效地减少内存碎片,大大提升内存分配效率;
    • 3 内存链方式:将长度不一的小内存分配在一条内存页上,可以非常有效地使用内存,减少内存浪费。

    1.2.6、常用字符串操作模块

    支持字符串匹配查找、前(后)向比较、字符串分割、字符串大小写转换、H2B/B2H 转换、URL 编码/解码等功能。

    1.2.7、文件目录模块

    支持多级目录创建、多级目录扫描、文件句柄缓存等功能,同时在处理多级目录采用循环方式,避免了递归方式时可能的栈溢出的隐患。

    1.2.8、读配置文件模块

    支持读 name=value 形式的配置文件,value 较长时可以使用反斜杠()折行,采用配置表方式提取配置文件中的配置项。

    1.2.9、线程及线程池模块

    提供了跨平台的支持 Posix 规范的线程接口(支持WIN32);线程池模块通过多种措施最大程度地减少线程任务分配时的锁冲突(用在 acl 服务器框架中多进程多线程服务模型中)。

    1.2.10、数字键的 K-V 磁盘存储模块(zdb)

    采取 KEY/VALUE 分块存储方式,因为 KEY 限定为数字类型,只需内存计算便可算出 KEY 的位置,KEY 中存放了 VALUE 的位置,所以对于任何的数据查询只需两次磁盘定位。(本人在和讯做流量统计存储时,使用该种方式替代了BSD、TC 等采用B树的 K-V 存储)

    1.2.11、流式解析库

    该模块包括 xml、json、rfc2047、mime、base64、uucode、qpcode、charset 等编解码库,这些解码库均采用流式解析方式,适合于多种网络 IO 模型(阻塞/非阻塞TCP、UDP)。

    1.2.12、数据库封装库

    设计了统一的数据库操作接口及连接池处理方式,目前支持 sqlite/mysql。

    1.2.13、文件队列处理库

    支持多组目录队列文件的创建、扫描、删除等操作;常用于临时文件队列调度的服务程序中。

    二、平台支持及编译

    整个工程目前支持 Linux(AS4,5,6, CS4,5,6, ubuntu), Windows, MacOS, FreeBSD, Solaris。

    • Linux/UNIX: 编译器为 gcc,直接在终端命令行方式下分别进入 lib_acl/lib_protocol/lib_acl_cpp/lib_dict/lib_tls 目录下,运行 make 命令即可。
    • Windows: 可以用 VC2003/VC2008/VC2010/VC2012 进行编译。(如果需要用 VC6/VC2005 编译,可以参考 VC2003 的编译条件)。

    当在 WIN32 环境下使用动态库时有几点需要注意:

    • 使用 lib_acl 的动态库时,需要在用户的工程预定义: ACL_DLL;
    • 使用 lib_protocol 动态库中的 HTTP 库或 ICMP 库时,需要在工程中预定义 HTTP_DLL 或 ICMP_DLL;
    • 使用 lib_acl_cpp 的动态库时,需要在工程中预定义 ACL_CPP_DLL,如果您使用用 VC2003 编译环境则还需要预定义 VC2003;
    • 使用 lib_dict 的动态库时,需要在工程中预定义 DICT_DLL;
    • 使用 lib_tls 的动态库时,需要在工程中预定义 TLS_DLL。  

    三、项目资料

    github: https://github.com/zhengshuxin/acl

    sourceforge:http://sourceforge.net/projects/acl/

    相关技术博客:http://zsxxsz.iteye.com/

    QQ 群: 242722074

    acl 工程有大量的测试用例(近200个):https://github.com/zhengshuxin/acl/blob/master/SAMPLES.md

    此外,还几个实用的工具:

    1、服务器程序生成向导:https://github.com/zhengshuxin/acl/tree/master/app/wizard,使用该工具,可以快速地创建网络服务器程序(甚至于 HTTP WEB 服务器程序)

    2、全局唯一ID产生器:https://github.com/zhengshuxin/acl/tree/master/app/gid

    3、网络状态监控工具(WIN32):https://github.com/zhengshuxin/acl/tree/master/app/net_tools

    4、TCP 连接分配器:https://github.com/zhengshuxin/acl/tree/master/app/master_dispatch

    5、字符集转换器:https://github.com/zhengshuxin/acl/tree/master/app/jencode

    四、图例

    1、类索引图:



    2、异步 IO 类继承图



    3、IO 流继承图



    4、接收上传文件的 CGI 程序:



    5、文件下载客户端程序:



    6、网页下载程序:




    展开全文
  • 很多人学习编程技术一般都通过一本编程语言的入门书籍,然后尝试做一些例子和小项目。但是这些都不能让我们深入的学习很多的编程技巧和高深技术,当然这个时候很多有经验的学习人员就会告诉大家,找一个好的开源软件...

            很多人学习编程技术一般都通过一本编程语言的入门书籍,然后尝试做一些例子和小项目。但是这些都不能让我们深入的学习很多的编程技巧和高深技术,当然这个时候很多有经验的学习人员就会告诉大家,找一个好的开源软件理解它的设计与实现原理,阅读开源项目的源代码,都知道源码之前了无秘密。我也承认读源码能够快速提高我们的编程能力和编程思维,我也经常研究很多项目的源代码,有些是工作需要,有些是兴趣。但是我今天想说的都不是这些,我想说的是更高一层的学习方案,就是通过自己的实践实现一个开源软件,也许这个开源软件没有任何人使用,但是在实现的这个过程中你会学习到很多,因为实现一个真正的开源软件需要使用到很多编程知识和技巧,这就会驱使你不断去学习这些编程知识和技巧,学会之后能够马上用于实践,真正实践完成以后你对这些编程知识和技巧理解就更深入了。

            我目前就正在做这样一件事情,我选择的是实现一个类似nginx的高性能http服务器。选择这个的理由很简单,我在一个互联网公司,http协议和http服务器经常和我打交道,在架构设计和分布式系统实现的时候可能都需要考虑这些。我开源的地址如下:https://github.com/brucewoo/JHttpServer,如果你也对这个感兴趣可以一起参与,包括设计功能,架构和实现。做这个开源项目的唯一目的就是学习,通过实践的方式来学习。关于这个开源软件的一切我都会以博客或者wiki的方式记录,包括每一个模块实现的原理,考虑,设计等等,可能还有核心代码的解读,争取做第一个学习型的开源软件。虽

    展开全文
  •  服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论)。服务器模型C/S模型结构:特点:逻辑简单。工作流程:I/O...
  • 《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、技巧和思想...
  • 《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、技巧和思想...
  • 《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐述编写高性能Linux服务器应用的方法、技巧和思想,...
  • 服务器条件NETTY框架编程: 服务器IP:192.168.2.106 端口8810 数据传输的方式:从串口接收到一条完整的协议数据,计算出数据字节长度,打包成HtAlingProtocol类,并发送给服务器; package ...
  • 0.6k Scut c# Python lua 游戏框架 1.2k Cuberite c++ Minecraft 服务器 3.2k agones go 基于k8s 分布式 3.2k NoahGameFrame c++ c# lua 可扩展 分布式,可用于 MMO MOBA 2.5k ET c# 配合 Unity3d 使用 3.5k 编程...
  • 《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、技巧和思想...
  • 6服务器编程核心要素、原理机制、工具框架等多角度全面阐述编写高性能 linux 服务器的方法
  • C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本课程会同时演示在linux和windows中的编程,课程中的线程和正则表达式都使用c++提供库。本课程包含了socket网络编程常用的所有特性,包括tcp、udp...
  • 教程视频:Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序
  • Linux高性能服务器编程 - 高清 - 带书签 tcp/ip协议详解,深入理解高性能服务器编程,io函数及io复用讲解,信号,定时器,io框架库libevent,多进程编程,多线程编程,进程池线程池等等的讲解
  • 《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐述编写高性能Linux服务器应用的方法、技巧和思想,...
  • 《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架
  • linux高性能服务器编程书本总结

    千次阅读 2019-03-02 14:58:41
    5-6章节 主要介绍 套接字编程API的使用和介绍 7章 是linux 服务器方面的一个规范操作 8-9 服务器的架构模式 --也是本书最重要的章节 8是内核 10章 信号 11章定时器 12章 libevent 开源库 13-14 ...
  • 本书是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、技巧和思想。不仅理论全面、深入...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 289,053
精华内容 115,621
关键字:

服务器编程框架