C++ HttpServlet 高并发多线程 HTTP 服务器(转)
from:http://www.oschina.net/code/snippet_568966_43193
C/C++ 程序虽然执行效率高,但程序员在开发 WEB 应用时却因为没有好的 WEB 开发框架而导致开发效率低,所以 C/C++ 一般被用在开发执行效率高的后台服务器程序,目前有了跨平台网络通信与服务器框架(acl库)后这一情况得到很大改观,在 acl 库中提供了类似于 JAVA HttpServlet 的开发接口,大大提高了 C/C++ 程序员开发 WEB 应用的效率,acl 库中有完整的服务器开发框架,更使得 C/C++ 程序员可以快速地写出高效的 WEB 服务器程序。本例子为一个简单的 WEB 服务器程序,其在 acl 库中的位置:acl\lib_acl_cpp\samples\master_http_threads
acl 库下载:http://sourceforge.net/projects/acl/
acl 库的 github:https://github.com/zhengshuxin/acl
更多技术文章:http://zsxxsz.iteye.com
QQ 群:242722074 
acl 库下载:http://sourceforge.net/projects/acl/
acl 库的 github:https://github.com/zhengshuxin/acl
更多技术文章:http://zsxxsz.iteye.com
QQ 群:242722074
标签: acl
代码片段(1)[全屏查看所有代码]
1. [代码][C/C++]代码
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 | --------------------------- main.cpp ----------------------------------#include "stdafx.h"#include "master_service.h"intmain(intargc, char* argv[]){    // 初始化 acl 库    acl::acl_cpp_init();    master_service& ms = acl::singleton2<master_service>::get_instance();    // 设置配置参数表    ms.set_cfg_int(var_conf_int_tab);    ms.set_cfg_int64(var_conf_int64_tab);    ms.set_cfg_str(var_conf_str_tab);    ms.set_cfg_bool(var_conf_bool_tab);    // 开始运行    if(argc >= 2 && strcmp(argv[1], "alone") == 0)    {        constchar* addr = ":8888";        printf("listen on: %s\r\n", addr);        ms.run_alone(addr, NULL, 0, 256);  // 单独运行方式    }    else        ms.run_daemon(argc, argv);  // acl_master 控制模式运行    return0;}--------------------------- master_service.cpp ----------------------------------#include "stdafx.h"#include "master_service.h"////////////////////////////////////////////////////////////////////////////////// 配置内容项char*var_cfg_str;acl::master_str_tbl var_conf_str_tab[] = {    { "str", "test_msg", &var_cfg_str },    { 0, 0, 0 }};intvar_cfg_bool;acl::master_bool_tbl var_conf_bool_tab[] = {    { "bool", 1, &var_cfg_bool },    { 0, 0, 0 }};intvar_cfg_buf_size;acl::master_int_tbl var_conf_int_tab[] = {    { "buf_size", 1024, &var_cfg_buf_size, 0, 0 },    { 0, 0 , 0 , 0, 0 }};longlongintvar_cfg_int64;acl::master_int64_tbl var_conf_int64_tab[] = {    { "int64", 120, &var_cfg_int64, 0, 0 },    { 0, 0 , 0 , 0, 0 }};////////////////////////////////////////////////////////////////////////////////master_service::master_service(): res_buf_(NULL){}master_service::~master_service(){    if(res_buf_)        acl_myfree(res_buf_);}boolmaster_service::thread_on_read(acl::socket_stream* stream){    logger("thread id: %lu", acl_pthread_self());    acl::http_response res(stream);    // 响应数据体为 xml 格式    res.response_header().set_content_type("text/html");    // 读 HTTP 请求头    if(res.read_header() == false)        returnfalse;    acl::string buf;    // 读 HTTP 请求体数据    if(res.get_body(buf) == false)        returnfalse;    acl::http_client* client = res.get_client();    // 判断客户端是否希望保持长连接    boolkeep_alive = client->keep_alive();    // 返回数据给客户端    res.response_header()        .set_status(200)        .set_keep_alive(keep_alive)        .set_content_length(var_cfg_buf_size);    if(res.response(res_buf_, var_cfg_buf_size) == false)        returnfalse;    returnkeep_alive ? true: false;}boolmaster_service::thread_on_accept(acl::socket_stream* conn){    if(0)        acl_tcp_so_linger(conn->sock_handle(), 1, 0);    logger("thread id: %lu", acl_pthread_self());    returntrue;}boolmaster_service::thread_on_timeout(acl::socket_stream*){    returnfalse;}voidmaster_service::thread_on_close(acl::socket_stream*){    logger("thread id: %lu", acl_pthread_self());}voidmaster_service::thread_on_init(){}voidmaster_service::thread_on_exit(){}voidmaster_service::proc_on_init(){    logger("thread id: %lu", acl_pthread_self());    if(var_cfg_buf_size <= 0)        var_cfg_buf_size = 1024;    res_buf_ = (char*) acl_mymalloc(var_cfg_buf_size + 1);    inti;    for(i = 0; i < var_cfg_buf_size; i++)        res_buf_[i] = 'X';    res_buf_[i] = 0;}voidmaster_service::proc_on_exit(){}------------------------------- master_service.h -------------------------------#pragma once#include "acl_cpp/master/master_threads.hpp"#include "acl_cpp/master/master_conf.hpp"////////////////////////////////////////////////////////////////////////////////// 配置内容项externchar*var_cfg_str;externacl::master_str_tbl var_conf_str_tab[];externintvar_cfg_bool;externacl::master_bool_tbl var_conf_bool_tab[];externintvar_cfg_buf_size;externacl::master_int_tbl var_conf_int_tab[];externlonglongintvar_cfg_int64;externacl::master_int64_tbl var_conf_int64_tab[];//////////////////////////////////////////////////////////////////////////////////class acl::socket_stream;classmaster_service : publicacl::master_threads{public:    master_service();    ~master_service();protected:    /**     * 纯虚函数:当某个客户端连接有数据可读或关闭或出错时调用此函数     * @param stream {socket_stream*}     * @return {bool} 返回 false 则表示当函数返回后需要关闭连接,     *  否则表示需要保持长连接,如果该流出错,则应用应该返回 false     */    virtualboolthread_on_read(acl::socket_stream* stream);    /**     * 当线程池中的某个线程获得一个连接时的回调函数,     * 子类可以做一些初始化工作     * @param stream {socket_stream*}     * @return {bool} 如果返回 false 则表示子类要求关闭连接,而不     *  必将该连接再传递至 thread_main 过程     */    virtualboolthread_on_accept(acl::socket_stream* stream);    /**     * 当某个网络连接的 IO 读写超时时的回调函数,如果该函数返回 true 则表示继续等待下一次     * 读写,否则则希望关闭该连接     * @param stream {socket_stream*}     * @return {bool} 如果返回 false 则表示子类要求关闭连接,而不     *  必将该连接再传递至 thread_main 过程     */    virtualboolthread_on_timeout(acl::socket_stream* stream);    /**     * 当与某个线程绑定的连接关闭时的回调函数     * @param stream {socket_stream*}     */    virtualvoidthread_on_close(acl::socket_stream* stream);    /**     * 当线程池中一个新线程被创建时的回调函数     */    virtualvoidthread_on_init();    /**     * 当线程池中一个线程退出时的回调函数     */    virtualvoidthread_on_exit();    /**     * 当进程切换用户身份后调用的回调函数,此函数被调用时,进程     * 的权限为普通受限级别     */    virtualvoidproc_on_init();    /**     * 当进程退出前调用的回调函数     */    virtualvoidproc_on_exit();private:    char* res_buf_;};----------------------------- stdafx.h ---------------------------------------// stdafx.h : 标准系统包含文件的包含文件,// 或是常用但不常更改的项目特定的包含文件//#pragma once//#include <iostream>//#include <tchar.h>// TODO: 在此处引用程序要求的附加头文件#include "lib_acl.h"#include "acl_cpp/lib_acl.hpp" | 
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号