Mars的复合连接实现简介

复合连接介绍:

  1. 初始阶段,应用发起对 IP1 &Port1 的 connect 调用;
  2. 第4秒的时候,如果第一个 connect 还没有返回,则发起对 IP2 &Port2 的 connect 调用;
  3. 以此类推,直至全部的 IP&Port 的 connect 调用全部执行完毕。

实现分析:

(1) 每一对IP&PORT,构造出一个ConnectCheckFSM类的实例,并依次放入列表vecsocketfsm(类型为std::vector)中;
(2) 进入do-while(true)循环,分别计算每一轮的poll()的超时时间timeout,直至发现成功的socke连接、或所有的IP&PORT都已尝试且有异常或超时出现;
具体策略:
声明的变量:
curtime:当前时间;
laststart_connecttime:上一次连接发起的时间记为;
next_connect_timeout:距离下一次连接发起的剩余时间;
1、timeout初始值为每一个IP&PORT的超时时间10s。在每一轮poll前,先计算next_connect_timeout:
① 如果>0,表示下次连接时间未到,更新timeout为:
min(timeout, next_connect_timeout);
② 如果<=0,表示需要发起新的连接,更新timeout为:
min(timeout, interval); //interval为4s,表示每次连接的时间间隔;
2、 针对当前正在进行的连接IP&PORTs,分别计算各自距连接超时所剩余的时间(ConnectTimeout()函数),确保对[0, index)区间的每一个连接,
timeout = min(timeout, vecsocketfsm[i]距连接超时所剩余的时间), i >= 0 & i< index; 并执行PreSelect函数,分三种情况:
① EStart: 表示连接还未创建,创建socket,设置nonBlock属性,调用connect()函数进行连接,监听该socket的POLLOUT事件;在调用connect()函数前,记下start_connecttime_时间,表示连接的起始时间;
② EConnecting:
表示正在连接过程中,继续监听该socket添加POLLOUT事件;
③ EReadWrite:
表示连接成功,增加监听该socket的POLLIN事件;
3、 执行poll(timeout)函数;
4、 poll()函数返回,返回值记为ret:
① ret < 0:系统异常,break;
② 用户自己终端,beak;
③ 检查每一个在连接的vecsocketfsm[i],执行AfterSelect函数:
AfterSelect()函数分EConnecting和EReadWrite两个版本:

  • EConnecting -> AfterConnectSelect
    是否POLLERR或POLLNVAL;
    socket是否出现SO_ERROR属性;
    socket是否可写,POLLOUT事件就绪?就绪表示连接成功;
    超时时间是否已到?
  • EReadWrite -> AfterReadWriteSelect
    是否POLLERR或POLLNVAL;
    是否读事件(POLLIN)就绪?是否写事件(POLLOUT)就绪?

你可能感兴趣的:(Mars的复合连接实现简介)