【sylar服务器】TcpServer网络连接管理
作者:互联网
目录
[1]sylar服务器 https://github.com/sylar-yin/sylar
TcpServer
1、TcpServer
- 前面讲的内容,大多为本机资源的调度,作为服务器程序,关于客户端连接,同样需要注意。TcpServer类负责接收外部客户端的连接,并做相关响应。本文的从私有成员入手,去了解怎么实现的网络的连接。(这里只对网络连接部分代的码进行了了解)
1.1、私有成员
/// 监听Socket数组
std::vector<Socket::ptr> m_socks;
/// 新连接的Socket工作的调度器
IOManager* m_worker;
IOManager* m_ioWorker;
/// 服务器Socket接收连接的调度器
IOManager* m_acceptWorker;
/// 服务器名称
std::string m_name;
/// 服务器类型
std::string m_type = "tcp";
/// 服务是否停止
bool m_isStop;
bool m_ssl = false;
TcpServerConf::ptr m_conf;
- m_socks:一个数组中存放的都是监听套接字,等待客户端发起的连接
m_worker、m_ioWorker、m_acceptWorker:三个调度器类型,分别负责一般性函数的处理调度、监控套接字的响应调度、对监控套接字操作的调度。(调度器就是一个被包装了的协程管理)
从私有成员我们可以简单的看出来,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的绑定,这一点可以放在自己的代码改进。
1.4、致谢
- 感谢sylar开源代码供网友学习。
标签:监听,调度,TcpServer,网络连接,sylar,接字,连接 来源: https://www.cnblogs.com/wlm-198/p/12502915.html