最近开始看Tair的源码实现,Tair的通信使用的是淘宝的开源的网络库tbnet实现。具体来说是依靠tbnet::Transport类型实现,其源代码路径如下:
http://code.taobao.org/svn/tb-common-utils/trunk/tbnet/src
下面介绍其通信流程:
1. 启动
Transport::start()完成其启动,主要工作是启动了两个线程:_readWriteThread和_timeoutThread. 这两个线程的实际入口函数式Tranport::run(), 下面是Transport::run的实现:

    1. void Transport::run(tbsys::CThread *thread, void *arg) {
    2. if (thread == &_timeoutThread) {
    3. timeoutLoop();
    4. } else {
    5. eventLoop((SocketEvent*)arg);
    6. }
    7. }

A. 读写线程:
        1. 读写线程使用epoll实现,在Transport中存在一个EPollSocketEvent _socketEvent 成员变量, arg传入的是这个成员变量的指针,EPollSocketEvent是epoll个操作的封装,在EPollSocketEvent的构造函数中会调用epoll_create初始化epoll。
        2. eventLoop的实现步骤如下:
                a.  调用socketEvent->getEvents() 取得发生的事件并放入到ioevents数组中
                        i.  调用epoll_wait等待读写事件;
                        ii. 每个事件的events[i].data.ptr存放有事件对应的IOComonet(socket 封装),可以用来处理读写事件;
                b.  对于读写事件,分别调用ioc->handleReadEvent()和ioc->handleWriteEvent()处理;
    
    B. timeout线程
        1. 主要用于检查通信的socket是否超过一定时常没有使用,对于TCPComponent(封装通信socket),如果15分钟没有使用,则断开连接;

2. 监听
通过调用Transport::listen()完成监听, 主要完成以下步骤:
    a.  创建TCPAcceptor,继承于IOComonet(socket 封装),并启动异步监听;
    b. 调用addComponent(acceptor, true, false);
            i.  创建epoll_event ev,设置ev.data.ptr = socket->getIOComponent(),用来处理读写事件的IOComponentsocket 封装)
            ii. 调用epoll_ctl(_iepfd,EPOLL_CTL_ADD,socket->getSocketHandle(),&ev)注册监听socket上的读取事件;
    c. 当客户端有connect请求过来的时候会触发监听socket上的读取事件,TCPAcceptor::handleReadEvent()会被调用。

3. 接受客户端的连接请求
系统在TCPAcceptor::handleReadEvent()中接受客户端的连接请求,主要步骤如下:
    a. socket = ((ServerSocket*)_socket)->accept() 接受连接请求并得到通信socket;
    b. 创建TCPComponent封装通信socket;
    c. 调用addComponent(component, true, false) 注册当前socket的读取事件。

4. 数据通信
    A. 数据读取
         数据通信由通信socket完成,该socket在epoll中注册,当有数据需要读取的时候会触发读取事件并调用TCPComponent::handleReadEvent()处理。
    B. 数据发送
         当有数据需要发送时Connection::postPacket()函数, 这个函数中会调用_iocomponent->enableWrite(true),注册写入事件,并调用TCPComponent::handleWriteEvent()处理。

最新文章

  1. ThreadLocal()理解
  2. 利用Nginx实现域名转发 不修改主机头
  3. MyBatis入门学习教程-Mybatis3.x与Spring4.x整合
  4. 【翻译五】java-中断机制
  5. zjuoj 3605 Find the Marble
  6. [转] 基于 Apache Mahout 构建社会化推荐引擎
  7. sqlite3的使用(iOS嵌入式关系数据库)
  8. 【Android测试】【随笔】与 “美丽说” 测试同事交流
  9. javascript中===与==
  10. delphi调用 java 的 WebService服务端.
  11. Scut:Redis 资源管理器
  12. HTTP服务器的本质:tinyhttpd源码分析及拓展
  13. 在MAC OS X中默认的Web共享目录
  14. 谷歌浏览器插件-jsonView插件安装与使用
  15. 服务部署到Swarm Cluster中
  16. java DOM
  17. spring框架学习笔记3:使用注解代替配置文件
  18. 02--css背景与边框--css揭秘
  19. ROS教程5 使用串口
  20. linux安装memcached

热门文章

  1. jenkins构建启动失败
  2. Robot Framework 教程 (6) - 使用条件表达式
  3. [cnBeta]阿里云推出全栈IPv6解决方案 加速推进下一代互联网应用
  4. js 时间处理函数 获取今天的前几天和后几天的任意一天
  5. Java中split的对象被特殊字符(.或|)分隔
  6. mybatis映射文件的使用(一),工程目录结构、源代码和数据库
  7. AtCoder Regular Contest 081
  8. c++11 语言级线程
  9. 【BZOJ2839】集合计数(容斥,动态规划)
  10. 51nod 1471 小S的兴趣 | 分块 链表