--------------------------- 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"
|