【sylar服务器】TcpServer网络连接管理
目录
TcpServer
[1]sylar服务器 https://github.com/sylar-yin/sylar
TcpServer
1、TcpServer
- 前面讲的内容,大多为本机资源的调度,作为服务器程序,关于客户端连接,同样需要注意。TcpServer类负责接收外部客户端的连接,并做相关响应。本文的从私有成员入手,去了解怎么实现的网络的连接。(这里只对网络连接部分代的码进行了了解)
1.1、私有成员
```c /// 监听Socket数组 std::vector- 从私有成员我们可以简单的看出来,TcpServer通过设置一组监听套接字,并将相关的监听函数、处理函数都交给了调度器,这样实现高并发的处理。下面我们就要看看具体的实现。
1.2、socket连接处理
作为tcp服务器连接,对socket的配置做相关封装,对于基本的bind,这里不展开(sylar对socket的socket的配置都做了类的封装)。我只对socket连接处理进行了解。
bool TcpServer::start() {
if(!m_isStop) {
return true;
}
m_isStop = false;
for(auto& sock : m_socks) {
m_acceptWorker->schedule(std::bind(&TcpServer::startAccept,
shared_from_this(), sock));
}
return true;
}
void TcpServer::startAccept(Socket::ptr sock) {
while(!m_isStop) {
Socket::ptr client = sock->accept();
if(client) {
client->setRecvTimeout(m_recvTimeout);
m_ioWorker->schedule(std::bind(&TcpServer::handleClient,
shared_from_this(), client));
} else {
SYLAR_LOG_ERROR(g_logger) << "accept errno=" << errno
<< " errstr=" << strerror(errno);
}
}
}
- start函数利用m_acceptWorker让所有监控套接字启动等待连接,并进入startAccpet函数来实现,并等待新的连接,新的连接到达后,再通过m_ioWorker来实现对处理函数的调度。在整体的调度上利用了m_isStop等相关的标志变量来进行辅助。
1.3、思考
tcp这里对外部连接的处理并不是负责,但是对于我这种新手来说,也是很好的学习资料。
- 在我的应用设计种,我是基于select来实现外部的高访问,当然对于高并发的环境epoll更适合。那么我在设计基于select封装的连接类,应该要注意一些问题。
- 可以设置多个监听套接字,但是要对监听套接字进行相关的管理
- select是通过循环根据标识变化来对外部连接进行响应的,同时这里在select中登记的函数都是监听函数,当有新的连接产生后,就给一个accpet去接收,然后调线程去处理。
- 线程控制上,可以实现一个线程池,利用堆的方式来进行相关资源的回收调度,另外在sylar中利用智能指针的方式来绑定函数,来实现向无参function的绑定,这一点可以放在自己的代码改进。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律