【sylar服务器】TcpServer网络连接管理

目录

TcpServer

  1. 1、TcpServer
    1. 1.1、私有成员
    2. 1.2、sock连接处理
    3. 1.3、思考
    4. 1.4、致谢

[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开源代码供网友学习。

猜你喜欢

转载自www.cnblogs.com/wlm-198/p/12502915.html
今日推荐