- --------------------------- main.cpp ----------------------------------
- #include "stdafx.h"
- #include "master_service.h"
- int main(int argc, 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)
- {
- const char* addr = ":8888";
- printf("listen on: %s\\r\\n", addr);
- ms.run_alone(addr, NULL, 0, 256); // 单独运行方式
- }
- else
- ms.run_daemon(argc, argv); // acl_master 控制模式运行
- return 0;
- }
- --------------------------- 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 }
- };
- int var_cfg_bool;
- acl::master_bool_tbl var_conf_bool_tab[] = {
- { "bool", 1, &var_cfg_bool },
- { 0, 0, 0 }
- };
- int var_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 }
- };
- long long int var_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_);
- }
- bool master_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)
- return false;
- acl::string buf;
- // 读 HTTP 请求体数据
- if (res.get_body(buf) == false)
- return false;
- acl::http_client* client = res.get_client();
- // 判断客户端是否希望保持长连接
- bool keep_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)
- return false;
- return keep_alive ? true : false;
- }
- bool master_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());
- return true;
- }
- bool master_service::thread_on_timeout(acl::socket_stream*)
- {
- return false;
- }
- void master_service::thread_on_close(acl::socket_stream*)
- {
- logger("thread id: %lu", acl_pthread_self());
- }
- void master_service::thread_on_init()
- {
- }
- void master_service::thread_on_exit()
- {
- }
- void master_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);
- int i;
- for (i = 0; i < var_cfg_buf_size; i++)
- res_buf_[i] = 'X';
- res_buf_[i] = 0;
- }
- void master_service::proc_on_exit()
- {
- }
- ------------------------------- master_service.h -------------------------------
- #pragma once
- #include "acl_cpp/master/master_threads.hpp"
- #include "acl_cpp/master/master_conf.hpp"
- ////////////////////////////////////////////////////////////////////////////////
- // 配置内容项
- extern char *var_cfg_str;
- extern acl::master_str_tbl var_conf_str_tab[];
- extern int var_cfg_bool;
- extern acl::master_bool_tbl var_conf_bool_tab[];
- extern int var_cfg_buf_size;
- extern acl::master_int_tbl var_conf_int_tab[];
- extern long long int var_cfg_int64;
- extern acl::master_int64_tbl var_conf_int64_tab[];
- ////////////////////////////////////////////////////////////////////////////////
- //class acl::socket_stream;
- class master_service : public acl::master_threads
- {
- public:
- master_service();
- ~master_service();
- protected:
- /**
- * 纯虚函数:当某个客户端连接有数据可读或关闭或出错时调用此函数
- * @param stream {socket_stream*}
- * @return {bool} 返回 false 则表示当函数返回后需要关闭连接,
- * 否则表示需要保持长连接,如果该流出错,则应用应该返回 false
- */
- virtual bool thread_on_read(acl::socket_stream* stream);
- /**
- * 当线程池中的某个线程获得一个连接时的回调函数,
- * 子类可以做一些初始化工作
- * @param stream {socket_stream*}
- * @return {bool} 如果返回 false 则表示子类要求关闭连接,而不
- * 必将该连接再传递至 thread_main 过程
- */
- virtual bool thread_on_accept(acl::socket_stream* stream);
- /**
- * 当某个网络连接的 IO 读写超时时的回调函数,如果该函数返回 true 则表示继续等待下一次
- * 读写,否则则希望关闭该连接
- * @param stream {socket_stream*}
- * @return {bool} 如果返回 false 则表示子类要求关闭连接,而不
- * 必将该连接再传递至 thread_main 过程
- */
- virtual bool thread_on_timeout(acl::socket_stream* stream);
- /**
- * 当与某个线程绑定的连接关闭时的回调函数
- * @param stream {socket_stream*}
- */
- virtual void thread_on_close(acl::socket_stream* stream);
- /**
- * 当线程池中一个新线程被创建时的回调函数
- */
- virtual void thread_on_init();
- /**
- * 当线程池中一个线程退出时的回调函数
- */
- virtual void thread_on_exit();
- /**
- * 当进程切换用户身份后调用的回调函数,此函数被调用时,进程
- * 的权限为普通受限级别
- */
- virtual void proc_on_init();
- /**
- * 当进程退出前调用的回调函数
- */
- virtual void proc_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"
- //该片段来自于http://www.codesnippet.cn/detail/1102201511762.html
来源: http://www.codesnippet.cn/detail/1102201511762.html