acl/app/wizard/tmpl/master/master_aio.cpp
2014-11-19 00:25:21 +08:00

156 lines
3.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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_int;
acl::master_int_tbl var_conf_int_tab[] = {
{ "int", 120, &var_cfg_int, 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 }
};
////////////////////////////////////////////////////////////////////////////////
// acl::aio_callback 虚类的子类定义
class io_callback : public acl::aio_callback
{
public:
io_callback(acl::aio_socket_stream* client)
: client_(client)
{
}
~io_callback()
{
}
protected:
/**
* 实现父类中的虚函数,客户端流的读成功回调过程
* @param data {char*} 读到的数据地址
* @param len {int} 读到的数据长度
* @return {bool} 返回 true 表示继续,否则希望关闭该异步流
*/
virtual bool read_callback(char* data, int len)
{
if (strncmp(data, "quit", 4) == 0)
{
// 可以显式地调用异步流的关闭过程,也可以直接返回 false
// 通知异步框架自动关闭该异步流
// client_->close();
return false;
}
client_->write(data, len);
return true;
}
/**
* 实现父类中的虚函数,客户端流的写成功回调过程
* @return {bool} 返回 true 表示继续,否则希望关闭该异步流
*/
virtual bool write_callback()
{
return true;
}
/**
* 实现父类中的虚函数,客户端流的关闭回调过程
*/
virtual void close_callback()
{
// 必须在此处删除该动态分配的回调类对象以防止内存泄露
delete this;
}
/**
* 实现父类中的虚函数,客户端流的超时回调过程
* @return {bool} 返回 true 表示继续,否则希望关闭该异步流
*/
virtual bool timeout_callback()
{
// 返回 false 通知异步框架关闭该异步流
return false;
}
private:
acl::aio_socket_stream* client_;
};
////////////////////////////////////////////////////////////////////////////////
master_service::master_service()
{
}
master_service::~master_service()
{
}
bool master_service::on_accept(acl::aio_socket_stream* client)
{
logger("connect from %s, fd %d", client->get_peer(true),
client->sock_handle());
// 创建异步客户端流的回调对象并与该异步流进行绑定
io_callback* callback = new io_callback(client);
// 注册异步流的读回调过程
client->add_read_callback(callback);
// 注册异步流的写回调过程
client->add_write_callback(callback);
// 注册异步流的关闭回调过程
client->add_close_callback(callback);
// 注册异步流的超时回调过程
client->add_timeout_callback(callback);
// 写欢迎信息
// client->format("hello, you're welcome\r\n");
// 从异步流读一行数据,当读到完整一行数据时回调 acl::aio_callback
// 中的 read_callback 虚函数
client->gets(10, false);
// 从异步流中读取不定长数据,当读到数据后回调 acl::aio_callback
// 中的 read_callback 虚函数
// client->read();
// 监控异步流的读状态,当有数据可读时,回调 acl::aio_callback
// 中的 read_wakeup 虚函数
// client->read_wait();
return true;
}
void master_service::proc_on_init()
{
}
void master_service::proc_on_exit()
{
}