必须的知识储备
1、boost的circular_buffer。
2、c++的shared_ptr和weak_ptr。
3、Timing wheel。
代码实现
主要数据结构
1、Entry结构持有连接(TCPConn)的弱引用。
2、Entry的析构函数实现了连接的主动关闭。本质上就是把连接的管理交给了Entry结构。
typedef std::weak_ptr<evpp::TCPConn> WeakTCPConnPtr;
struct Entry
{
explicit Entry(const WeakTCPConnPtr& weakConn)
: weakConn_(weakConn)
// , paccServer(server)
{
}
~Entry()
{
evpp::TCPConnPtr conn = weakConn_.lock(); //提升为强引用
if (conn)
{
conn->Close(); //会回调OnConnection,即使对端时非正常断开tcp连接
//paccServer->connections_.erase(conn); //关闭掉应用层的conn,2017-10-19,这个不需要处理,因为网络库会回调OnConnection,在哪里已经关闭了
//当客户端保活失败时,uid_conns跟mac_conns_不需要处理,只在要发送消息时,转换成强引用失败,再去删除这两个容器中的元素
AK_LOG_WARN << "client " << conn->remote_addr() << " keepalive failed";
}
}
WeakTCPConnPtr weakConn_;
//AccessServer *paccServer; //设置成静态成员,节省内存
};
实现类AccessServer。
1、connectionBuckets_变量使用boost的circular_buffer实现了轮盘。
2、connectionBuckets_放的是std::unordered_set,说明轮盘的一个格子可以存放多个连接。
class AccessServer
{
public:
AccessServer(evpp::EventLoop* loop, const std::string& addr, const std::string& name, uint32_t thread_num);
void Start();
public:
//friend struct Entry;
//message已经是一条

最低0.47元/天 解锁文章
2301

被折叠的 条评论
为什么被折叠?



