程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> muduo庫源碼剖析(二) 服務端

muduo庫源碼剖析(二) 服務端

編輯:關於C++

一. TcpServer類:

管理所有的TCP客戶連接,TcpServer供用戶直接使用,生命期由用戶直接控制。用戶只需設置好相應的回調函數(如消息處理messageCallback)然後TcpServer::start()即可。

主要數據成員:

boost::scoped_ptr<Accepter> acceptor_; 用來接受連接

std::map<string,TcpConnectionPtr> connections_; 用來存儲所有連接

connectonCallback_,messageCallback_,writeCompleteCallback_,用來接受用戶注冊的回調函數

EventLoop* loop; 接受連接的事件循環

主要功能函數:

set*Callbak() 注冊用戶回調函數

newconnection() 需要在構造函數內將其注冊給Acceptor,當Acceptor接受一個連接之後回調該函數。在本函數內部新建一個connection對象,並將 *Callback_注冊給新建的 Connection 對象。最後,從線程池取出一個線程做I/O線程,在該I/O線程的 EventLoop 的 runInLoop() 中傳入 TcpConnection::connectEstablished(). 因為必然不在一個線程中,在runInLoop()中調用EventLoop::quueInLoop(),將TcpConnection::connectEstablished()加入pendingFunctors.

二. Acceptor類:

負責監聽連接請求,接收連接並將新的連接返回給TcpServer。

Acceptor主要是供TcpServer使用的,其生命期由後者控制。一個Acceptor相當於持有服務端的一個listenning socket描述符,該socket可以accept多個TCP客戶連接,。

主要數據成員:

EventLoop* loop_;

Socket acceptSocket_;封裝了socket等,用來監聽

Channel acceptChannel_;Acceptor通過Channel向Poller注冊事件,EventLoop通過Channel分發回調Acceptor相應的事件處理函數。

boost::function<void(sockfd,InetAddress&)>NewConnectionCallback_ , 連接請求接收之後,通過其回調TcpServer::newconnection().

主要功能函數:

listen(),調用Socket::listen()開始監聽,同時,調用Channel::enableReading()向Poller注冊可讀事件,有數據可讀代表新來了連接請求。

handleRead(),在構造函數中將其注冊給Channel::readCallback_。當Poller發現屬於Acceptor的Channel的可讀事件時,在EventLoop中會驅動Channel::handleEvent()-->Channel::handleEventWithGuard()進行事件分發,調用readCallback回調 Acceptor::handlRead(),在其內調用Socekt::accept(),再回調TcpServer::newconnection(),將新連接的sockfd傳回給TcpServer。

服務端監聽及接受連接的流程:

向Poller注冊監聽事件的主線調用流程,TcpServer::start()-->EventLoop::runInLoop(Acceptor::listen())-->Channel::enableReading()-->Channel::update(this)-->EventLoop::updateChannel(Channel*)-->Poller::updateChannel(Channel*)

接受連接,當Poller::poll()發現有事件就緒,通過 Poller::fillActiveChannel() 將就緒事件對應的 Channel 加入 ActiveChannelList,

EventLoop::loop()-->Poller::poll()-->Poller::fillActiveChannel(),loop()-->Channel::handleEvent()->Acceptor::handleRead()->TcpServer::newConnection()->EventLoop::runInLoop(bind(&TcpConnection::connectEstablished))->EventLoop::queueInLoop()->EventLoop::loop()->EventLoop::doPendingFunctors()->TcpConnection::connectEstablished()。

三. Connection類:

用於管理一個具體的TCP客戶連接,完成用戶指定的連接回調connectionCallback。
TcpConnection構造時接收參數有TCP連接的描述符sockfd,服務端地址localAddr,客戶端地址peerAddr,並通過Socket封裝sockfd。且采用Channel管理該sockfd,

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved