标签:关于 内容 智能 利用 type work ssl lis 线程
目录
[1]sylar服务器 https://github.com/sylar-yin/sylar
/// 监听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_worker、m_ioWorker、m_acceptWorker:三个调度器类型,分别负责一般性函数的处理调度、监控套接字的响应调度、对监控套接字操作的调度。(调度器就是一个被包装了的协程管理)
从私有成员我们可以简单的看出来,TcpServer通过设置一组监听套接字,并将相关的监听函数、处理函数都交给了调度器,这样实现高并发的处理。下面我们就要看看具体的实现。
作为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);
}
}
}
tcp这里对外部连接的处理并不是负责,但是对于我这种新手来说,也是很好的学习资料。
标签:关于 内容 智能 利用 type work ssl lis 线程
原文地址:https://www.cnblogs.com/wlm-198/p/12502915.html