`
zsxxsz
  • 浏览: 446506 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用 acl 的生成向导快速创建一个C++ WEB 服务器

阅读更多

      在文章《使用 acl 生成向导快速创建服务器程序》中介绍如何使用 acl 的服务器生成向导自动创建服务器程序的过程,文章《使用 acl_cpp 的 HttpServlet 类及服务器框架编写WEB服务器程序》介绍了编写 HTTP 服务器的大体过程,本节将介绍如何使用 acl 提供的生成向导快速创建一个 WEB 服务器的过程。在 acl 项目的根目录下编译完所有的程序后(运行 make all),然后进入 app/wizard 目录编译向导程序(运行 make,win32 下可以使用 vc2003/vc2008/vc2010 编译),运行向导程序的过程如下:

 

$./wizard  #运行后向导程序提示如下:
select one below:
m: master_service; d: db; h: http; q: exit

#其中 'm' 表示生成一般性的服务器程序,'h' 表示可以生成 HTTP 类服务器程序,所以此处选  'h',接着向导程序提示输入所生成的服务器程序的名称,如可输入:http_server
please input your program name: http_server

#接着提示 HTTP 应用的类型,目前仅支持自动生成 HTTP 服务,所以只能选择 's'
please choose one http application type: s
s: http servlet
>s

#接着向导程序提示是否需要添加 cookie 的支持,可以选择 'y'
Do you want add cookie? y[y/n]: y

#输入 cookie 名称
Please enter cookie name: mycookie
create http_server/http_servlet.cpp ok.
#最后提示所采用的服务器模板类型:'t' 表示采用多进程多线程模式,'p' 表示采用多进程模式
choose master_service type:
        t: for master_threads
        p: for master_proc
>t

#向导程序便会自动生成以下文件:源文件,工程文件等
create http_server/http_server.cf ok.
create http_server/Makefile.in ok
create http_server/main.cpp ok
create http_server/master_service.h ok
create http_server/master_service.cpp ok
create http_server/http_servlet.h ok
create master_threads ok!
create http_server/Makefile ok.
create http_server/valgrind.sh ok.
create http_server/http_server.sln ok.
create http_server/http_server.vcproj ok.
create http_server/http_server_vc2012.sln ok.
create http_server/http_server_vc2012.vcxproj ok.
create http_server/http_server_vc2012.vcxproj.filters ok.
create http_server/Makefile.in ok
create http_server/stdafx.h ok
create http_server/stdafx.cpp ok
create common_files ok!

       OK,一个简单的 HTTP 服务器程序就生成了,整个过程不超过 10 秒。由上面显示可以看到向导生成的文件有:

 

       1、源程序文件:

             main.cpp,stdafx.cpp,master_service.cpp,http_servlet.cpp,

             stdafx.h,master_service.h,http_servlet.h

       2、配置文件:http_server.cf

       3、工程文件:Linux 下为 Makefile.in, Makefile;在 windows 下为 VC2003 的工程文件(http_server.sln,http_server.vcproj),以及 VC2012 的工程文件(http_server_vc2012.sln,http_server_vc2012.vcxproj,http_server_vc2012.vcxproj.filters)

       4、LINUX 下用来检测内存泄露的工具脚本:valgrind.sh

 

       在 http_server 目录下直接运行 make 编译,便可生成 http_server 可执行程序。该程序既可以放在 acl_master 服务器框架下运行(生产环境中),又可以以命令行方式手工直接运行(调试环境下)。为使浏览器可以直接访问该 WEB 服务,先打开 main.cpp 文件,将服务器监听地址(const char* addr)由 “127.0.0.1:8888” 改为 ":8888",然后再 make 重新生成 http_server 程序,手工运行:http_server 提示如下:

$./http_server alone   # 其中的参数 alone 通知程序以手工方式运行,可参见 main.cpp 中的代码
listen on: :8888
event_limit: max fdsize: 100001
src/event/events_epoll_thr.c(599), event_epoll_alloc_thr, use thread events - epoll

       然后在浏览器输入该服务器地址:http://192.168.188.112:8888/,得到的结果如下:

该 XML 文件并未包含任何关联的样式信息。文档树显示如下。
---------------------------------------------------------------------
      <root>
             <sessions>
                    <session sid="xxxxxx"/>
             </sessions>
             <params>
                    <param name1="null"/>
                    <param name2="null"/>
             </params>
      </root>

 

        下面为向导程序生成的主要源程序:

        一)、master_service.cpp

         在该文件中,需要关注四个函数:thread_on_accept、thread_on_read、thread_on_timeout、thread_on_close。这四个函数的参数都是 acl::socket_stream* 网络连接流对象。它们被调用的时机为:

         a、不接收到客户端连接请求时,acl 服务器框架会自动建立与客户端的连接, 同时回调 master_service::thread_on_accept(acl::socket_stream*) 虚函数,应用在此处生成 HTTP 服务器连接对象,并将其与 acl::socket_stream* 网络流关联:

bool master_service::thread_on_accept(acl::socket_stream* conn) 
{
        logger("connect from %s, fd: %d", conn->get_peer(true),
                conn->sock_handle());
        conn->set_rw_timeout(5);   // 设置客户端连接读超时时间

        http_servlet* servlet = new http_servlet();   // 创建 HTTP 服务对象
        conn->set_ctx(servlet); // 将该 HTTP 服务对象置入连接流中

        return true;
}  

         b、当客户端发来 HTTP 请求时,acl 服务器框架将回调 master_service::thread_on_read(acl::socket_stream*) 虚函数,代码如下:

bool master_service::thread_on_read(acl::socket_stream* conn)
{
        http_servlet* servlet = (http_servlet*) conn->get_ctx();  // 取出在 thread_on_accept 中设置的 HTTP 服务对象
        if (servlet == NULL)
                logger_fatal("servlet null!");

        // 调用 HTTP 服务过程,如果该函数返回 true 则表示需要与浏览器保持长连接,否则则告诉服务器框架需要关闭该客户端连接
        return servlet->doRun("127.0.0.1:11211", conn);
}

        c、如果 HTTP 客户端长时间不发送 HTTP 请求数据,则虚方法:master_service::thread_on_timeout(acl::socket_stream*) 将会由服务器框架调用,该函数若返回 false 则通知服务器框架需要关闭该超时的客户端连接,否则表示继续等待客户端发来请求(超时值在 thread_on_accept 中设置)。

        d、当客户端连接超时、客户端主动关闭连接或服务端主动关闭连接时,则虚方法 master_service::thread_on_close(acl::socket_stream*) 将由服务器框架调用,代码如下:

void master_service::thread_on_close(acl::socket_stream* conn)
{
        logger("disconnect from %s, fd: %d", conn->get_peer(),
                conn->sock_handle());

        // 取出在 thread_on_accept 中设置的 HTTP 服务对象,若非空则销毁之
        http_servlet* servlet = (http_servlet*) conn->get_ctx();
        if (servlet)
                delete servlet;
}

 

        以上四个虚函数非常简单易懂,但有一点需要注意:这四个虚函数的线程运行空间是不同的,thread_on_accept 方法是在服务进程的主线程空间运行的,而其它的三个虚方法则是在线程池中的任一子线程中运行的,且线程空间各不相同,即使对于 thread_on_read 方法,当同一客户端连接对象反复回调该方法时,其运行的线程空间也可能是不同的。

 

        在 thread_on_accept 中生成了一个 HTTP 服务类:http_servlet,该类的接口类似于 JAVA 的 HttpServlet 类,使用方法也类似。

        二)、http_servlet.cpp/http_servlet.h

        该类 (http_servlet) 继承于 acl::http_servlet 类,其需要重载基类的两个虚方法:doGet/doPost,关于如何使用该类,可以参考:《用C++实现类似于JAVA HttpServlet 的编程接口》,在此不再细讲。

 

         acl 库下载:http://sourceforge.net/projects/acl/

         svn:svn checkout svn://svn.code.sf.net/p/acl/code/trunk acl-code

         github:https://github.com/acl-dev/acl

         acl 的编译与使用:http://zsxxsz.iteye.com/blog/1506554

         qq 群:242722074

         微博:http://weibo.com/zsxxsz/

       

        文章参考:

         使用 acl::master_threads 类编写多进程多线程服务器程序

         用C++实现类似于JAVA HttpServlet 的编程接口

         acl 服务器模块的部署

 

0
0
分享到:
评论

相关推荐

    基于acl库封装c\c++ 的redis-client客户端源码

    基于acl库封装的redis client vs2010工程; 运行时解压到: redis-acl\lib_acl_cpp\samples\redis路径下,把lib_acl_vc2010d.lib、lib_acl_cpp_vc2010d.lib放到 \redis-acl\lib_acl_cpp\samples\redis\redisclient...

    acl C++跨平台库.rar

    acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...

    一个基于C++实现的完整进行FTP应用管理的 Server服务器源码例子

    服务器需要维持一个循环来处理并发连接,可能需要使用多线程或者异步I/O模型来提高性能。 FTP协议本身由一系列命令构成,如`USER`、`PASS`、`CWD`、`LIST`、`RETR`和`STOR`等。在C++代码中,我们需要解析这些命令,...

    华为数通+ACL生成树+思维导图

    例如,创建一个允许特定IP地址访问服务器的规则,需要指定源IP地址、动作(permit)和其他可能的匹配条件。 总的来说,华为数通结合ACL的网络通信解决方案能够实现精细化的网络访问控制,防止非法入侵,提高网络...

    嵌入式WEB服务器及远程测控应用详解

    Linux作为开源的操作系统,广泛应用于各种嵌入式设备,提供了一个稳定、灵活的基础平台来实现嵌入式WEB服务器。Linux提供了丰富的网络协议栈支持,可以方便地实现HTTP服务。同时,Linux还提供了丰富的开发工具和编程...

    实验:使用基本ACL限制公司网络访问.docx

    1. 构建网络拓扑:根据实验需求建立一个包含不同部门VLAN的网络模型,这有助于模拟实际公司的网络结构。 2. 配置VLAN和vlanif接口:VLAN(虚拟局域网)用于分割网络,提高安全性,并优化流量管理。vlanif接口是VLAN...

    lua and acl example

    标题“lua and acl example”揭示了本主题是关于使用Lua脚本语言与Access Control Lists (ACL)相结合的一个示例。Lua是一种轻量级的、解释型的编程语言,常用于游戏开发、配置文件、服务器应用等领域。而ACL则通常...

    acl,一个用于Linux、Mac、FreeBSD、Solaris(x86)、Windows、Android、iOS的高级C/C++库.zip

    例如,你可以使用ACL库来创建一个新的ACL,添加或删除特定用户或组的权限,或者检查现有文件的ACL设置。 对于Windows系统,ACL同样扮演着关键的角色,但其工作方式略有不同。Windows的安全模型基于安全标识符(SID...

    capirca, 多平台ACL生成系统.zip

    capirca, 多平台ACL生成系统 CapircaCapirca是一种利用网络。服务和高级策略文件共同定义的工具,用于促进各种平台的网络访问控制列表的开发和操作。 它是由谷歌为内部使用而开发的,现在是开源。

    linux 下web服务器每天生成日志的shell脚本

    在Linux环境中,Web服务器如Apache或Nginx每天都会生成大量的访问日志,这些日志对于监控服务器状态、分析用户行为、排查问题等都至关重要。为了有效地管理和利用这些日志,我们可以编写一个shell脚本来自动化地处理...

    简单代理服务器源码 c++

    在这个主题中,我们主要关注一个使用C++编程语言编写的简单代理服务器源码。C++是面向对象的编程语言,因其高效性和灵活性,在系统级编程和网络应用开发中被广泛应用。 代理服务器的基本工作原理是,当客户端通过...

    acl-master.zip_ACL库_c++ acl_git acl-master

    acl_cpp 是基于 acl 库的 C++ 库,包括 MIIME 解析、Handlersocket 客户端库、数据库连接池(支持mysql/sqlite)、WEB 编程、数据库编程、阻塞/非阻塞数据流等内容。

    acl 的使用方法

    1. 创建 ACL:创建 ACL 需要指定 ACL 的名称和编号。 2. 定义 ACL 规则:定义 ACL 规则需要指定规则的动作(permit 或 deny)、匹配选项和规则编号。 3. 应用 ACL:将 ACL 应用到网络设备上,以实现报文过滤和控制。...

    C++删除文件ACL权限

    删除文件权限,方便windows下一些ACL控制的限制!

    H3C交换机 典型配置举例-6W100-ACL典型配置举例

    3. 配置思路:我们将创建一个ACL规则,允许指定的主机访问服务器。 4. 配置步骤: * 步骤1:创建ACL规则,允许指定的主机访问服务器。 * 步骤2:将ACL规则应用于交换机的某个接口上。 5. 验证配置:使用命令`...

    锐捷交换机ACL配置

    1. **时间段定义**:在锐捷交换机中,我们需要首先定义一个或多个时间范围,如“工作日”、“休息日”或“晚上”,这些时间范围可以根据需要定制。时间范围的设置通常使用HH:MM到HH:MM格式,支持按天、周或年定义。 ...

    使用基本ACL限制公司网络访问.rar

    3、应用场景:使用基本ACL限制公司网络访问 4、特点:Word文档提供了实验的详细过程,包括每一步骤的操作命令和截图,并给出了实验的topo文件(包括配置信息) 5、适用人群:网络系统的建设与运维 6、使用说明:重点...

    acl-3.0.19

    acl 是 one advanced C/C++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/FreeBsd/MacOS 平台;整个 acl 项目主要包含三个函数库:lib_acl(纯C开发的基础库,主要包含...

    cpp-acl工程是一个跨平台的网络通信库及服务器编程框架

    acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、...

    EMQ配置ACL权限控制规则图文教程.pdf

    EMQ的ACL规则配置是以插件方式进行实现,以实现对信息发布 ...例个例子:拒绝用户名为Test的客户端向$sys/abc/主题发布信息。在EMQ X 中提供了多种ACL插件的支持,如内置ACL、MySQL ACL、Redis ACL、HTTP ACL等等。

Global site tag (gtag.js) - Google Analytics