mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-15 17:30:53 +08:00
104 lines
1.9 KiB
C++
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;
|
|
}
|