目录
类功能
类定义
类实现
编译测试
类功能
类定义
// 监听套接字管理类
class Acceptor
{
private:Socket _socket; // 用于创建监听套接字EventLoop *_loop; // 用于对监听套接字进行事件监控Channel _channel; // 用于对监控套接字进行事件管理using AcceptCallback = std::function<void(int)>;AcceptCallback _accept_callback;private:/*监听套接字的读事件回调处理函数 -- 获取新连接,调用_accept_callback函数进行新连接管理*/void HandleRead();public:Acceptor();void SetAcceptCallback();
};
类实现
// 监听套接字管理类
class Acceptor
{
private:Socket _socket; // 用于创建监听套接字EventLoop *_loop; // 用于对监听套接字进行事件监控Channel _channel; // 用于对监控套接字进行事件管理using AcceptCallback = std::function<void(int)>;AcceptCallback _accept_callback;private:/*监听套接字的读事件回调处理函数 -- 获取新连接,调用_accept_callback函数进行新连接管理*/void HandleRead(){int newfd = _socket.Accept();if (newfd < 0){return;}if (_accept_callback)_accept_callback(newfd);}int CreateServer(int port){bool ret = _socket.CreateServer(port);assert(ret == true);return _socket.Fd();}public:/* 不能将启动读监控,放到构造函数中,必须在设置回调函数后,再去启动*//* 否则有可能造成启动监控后,立即有事件,处理的时候回调函数还没有设置:新连接得不到处理,且资源泄漏*/Acceptor(EventLoop *loop, int port) : _socket(CreateServer(port)), _loop(loop),_channel(loop, _socket.Fd()){_channel.SetReadCallback(std::bind(&Acceptor::HandleRead, this));}void SetAcceptCallback(const AcceptCallback &cb) { _accept_callback = cb; }void Listen() { _channel.EnableRead(); }
};
编译测试
tcp_srv.cc
将tcp_srv.cc代码稍加修改,进行测试
关于主体代码参考
Connection模块类功能联调(整合三)-CSDN博客
#include "../source/server.hpp"EventLoop loop;
// 管理所有的连接
std::unordered_map<uint64_t, PtrConnection> _conns;
uint64_t conn_id = 0;
void ConnectionDestroy(const PtrConnection &conn)
{_conns.erase(conn->Id());
}
void OnConnected(const PtrConnection &conn)
{DBG_LOG("NEW CONNECTION:%p", conn.get());
}
void OnMessage(const PtrConnection &conn, Buffer *buf)
{DBG_LOG("%s", buf->ReadPosition());buf->MoveReadOffset(buf->ReadAbleSize());std::string str = "Hello World";conn->Send(str.c_str(), str.size());//conn->Shutdown(); // 调用关闭接口
}void NewConnection(int fd)
{conn_id++;PtrConnection conn(new Connection(&loop, conn_id, fd));conn->SetMessageCallback(std::bind(OnMessage, std::placeholders::_1, std::placeholders::_2));conn->SetSrvClosedCallback(std::bind(ConnectionDestroy, std::placeholders::_1));conn->SetConnectedCallback(std::bind(OnConnected, std::placeholders::_1));conn->EnableInactiveRelease(10); // 启动非活跃超时销毁conn->Established(); // 就绪初始化_conns.insert(std::make_pair(conn_id, conn));
}int main()
{srand(time(NULL));Acceptor acceptor(&loop, 8500);acceptor.SetAcceptCallback(std::bind(NewConnection, std::placeholders::_1));acceptor.Listen();while (1){loop.Start();}return 0;
}
测试结果
符合预期