2014-11-18 23:08:34 +08:00
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
#include "req_callback.h"
|
|
|
|
|
#include "res_callback.h"
|
|
|
|
|
|
|
|
|
|
res_callback::res_callback(req_callback* req, acl::ofstream* res_fp)
|
|
|
|
|
: conn_(NULL)
|
|
|
|
|
, req_(req)
|
|
|
|
|
, res_fp_(res_fp)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res_callback::~res_callback()
|
|
|
|
|
{
|
|
|
|
|
acl_assert(req_ == NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool res_callback::read_callback(char* data, int len)
|
|
|
|
|
{
|
|
|
|
|
if (req_ == NULL)
|
|
|
|
|
{
|
|
|
|
|
logger_warn("client peer disconnected!");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ȡ<>ÿͻ<C3BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
|
|
|
|
|
acl::aio_socket_stream& peer = req_->get_conn();
|
|
|
|
|
peer.write(data, len);
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱд<CAB1>뱾<EFBFBD><EBB1BE><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
if (res_fp_)
|
|
|
|
|
res_fp_->write(data, len);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void res_callback::close_callback()
|
|
|
|
|
{
|
|
|
|
|
if (req_)
|
|
|
|
|
{
|
|
|
|
|
req_callback* req = req_;
|
|
|
|
|
req_ = NULL;
|
|
|
|
|
req->disconnect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ˴<DAB4>ɾ<EFBFBD><C9BE><EFBFBD>ö<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD>ֹ<EFBFBD>ڴ<EFBFBD>й¶
|
|
|
|
|
delete this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool res_callback::open_callback()
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<49><4F>д<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
conn_->add_read_callback(this);
|
|
|
|
|
conn_->add_write_callback(this);
|
|
|
|
|
|
|
|
|
|
// <20>ȴ<EFBFBD><C8B4>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|
|
|
|
conn_->read();
|
|
|
|
|
|
|
|
|
|
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
acl_assert(req_);
|
|
|
|
|
req_->on_connected();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool res_callback::start(acl::aio_handle& handle, const char* server_addr)
|
|
|
|
|
{
|
|
|
|
|
conn_ = acl::aio_socket_stream::open(&handle, server_addr, 0);
|
|
|
|
|
if (conn_ == NULL)
|
|
|
|
|
{
|
|
|
|
|
logger_error("connect server %s error %s",
|
|
|
|
|
server_addr, acl::last_serror());
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
conn_->add_open_callback(this);
|
|
|
|
|
conn_->add_timeout_callback(this);
|
|
|
|
|
conn_->add_close_callback(this);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
acl::aio_socket_stream& res_callback::get_conn()
|
|
|
|
|
{
|
|
|
|
|
acl_assert(conn_);
|
|
|
|
|
return *conn_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void res_callback::disconnect()
|
|
|
|
|
{
|
|
|
|
|
if (conn_)
|
|
|
|
|
{
|
|
|
|
|
req_ = NULL;
|
|
|
|
|
conn_->close();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
delete this;
|
|
|
|
|
}
|