acl/lib_acl_cpp/samples/master_aio_proxy/req_callback.cpp

104 lines
1.9 KiB
C++

#include "stdafx.h"
#include "res_callback.h"
#include "req_callback.h"
req_callback::req_callback(acl::aio_socket_stream* conn,
acl::ofstream* req_fp, acl::ofstream* res_fp)
: conn_(conn)
, res_(NULL)
, req_fp_(req_fp)
, res_fp_(res_fp)
{
}
req_callback::~req_callback()
{
acl_assert(res_ == NULL);
}
bool req_callback::read_callback(char* data, int len)
{
if (res_ == NULL)
{
logger_warn("server peer disconnected!");
return false;
}
// 取得服务端连接,并将数据写入
acl::aio_socket_stream& peer = res_->get_conn();
peer.write(data, len);
// 将数据写入本地请求文件
if (req_fp_)
req_fp_->write(data, len);
return true;
}
void req_callback::close_callback()
{
logger("disconnect from %s, fd: %d", conn_->get_peer(),
conn_->sock_handle());
if (res_)
{
res_callback* res = res_;
res_ = NULL;
res->disconnect();
}
// 必须在此处删除该动态分配的回调类对象以防止内存泄露
delete this;
}
void req_callback::start(const char* server_addr)
{
// 注册异步流的读回调过程
conn_->add_read_callback(this);
// 注册异步流的写回调过程
conn_->add_write_callback(this);
// 注册异步流的关闭回调过程
conn_->add_close_callback(this);
// 注册异步流的超时回调过程
conn_->add_timeout_callback(this);
// 开始连接远程服务器
acl::aio_handle& handle = conn_->get_handle();
res_ = new res_callback(this, res_fp_);
if (res_->start(handle, server_addr) == false)
{
logger_error("connect server %s error %s",
server_addr, acl::last_serror());
delete res_;
res_ = NULL;
conn_->close();
}
}
acl::aio_socket_stream& req_callback::get_conn()
{
acl_assert(conn_);
return *conn_;
}
void req_callback::on_connected()
{
// 当连接服务端成功后调用此函数开始从客户端读取数据
conn_->read();
}
void req_callback::disconnect()
{
if (conn_)
{
res_ = NULL;
conn_->close();
}
else
delete this;
}