ljt80158015 发表于 2012-5-24 13:16:06

朋友移植的zlip源码

朋友移植的zlip源码
这里是一个朋友移植的zlip的定时器的源码,他对zlip进行了改进,问题之一就是为什么他加入了半连接状态的处理?zlip源码并没有这个状态?

void TCPTimer(void) REENTRANT
{
   TCP_SOCKET XDATA * pTCB;
   MEM_PCB XDATA *pMem;
   
   pTCB = pTCBList;
   pMem = MemAlloc(TCP_MEM_DEFAULT_SIZE);
   
   if (pTCB != NULL)
   {   
      do
      {
         if (pMem != NULL)
         if (pTCB->NeedSendACK) //该tcp需要发送延迟ack
         if (pTCB->State != TCP_STATE_HALF_ESTABLISHED) //半发送状态不允许发送应答,因为这将关闭连接,而我方正在发送数据的函数会被破坏
         {
            if (pTCB->DelayAckTimer == 0) //若超时到则发送ack
            {
               pMem->UsedSize = 0;         
               TCPSend(pMem, pTCB, TCP_ACK);
               pTCB->NeedSendACK = FALSE; //已经发送ack,不需要再次发送
               
               MemFree(pMem); //因为arp层可能缓存该报,需要释放原来的内存重新获取一个内存用于下一个tcp的延迟ack发送
               pMem = MemAlloc(TCP_MEM_DEFAULT_SIZE);               
            }
            else
            {
               pTCB->DelayAckTimer--;
            }
         }
      
         if (pTCB->InRTO) //该tcp处于超时重传队列
         {            
            if (pTCB->RTOCnt == pTCB->RTO ) //超时到则重传未被应答数据队列的第一个数据报
            {
               if (pTCB->RetransNum == TCP_TIMEOUT_NUM) //若对方由于某些不明的原因导致tcp连接并非正常断开,而引起我方不断重传某一个数据报
               {
                  if (!pTCB->InSending) //若此时该tcp未传送数据,传送数据时不能被打断
                  {
                     TCPRelease(pTCB); //我方快速关闭连接
                  }
               }
               else
               {
                  TCPRetransmit(pTCB->pUnackQList->pSavMem, pTCB);
                  pTCB->RetransNum++;
               
                  pTCB->RTO = MIN_VALUE((pTCB->RTO<<1), TCP_RTO_MAX); //RTO进行退避
               
                  pTCB->RTOCnt = 0; //超时计数器清0
               
                  pTCB->ssthresh = (MIN_VALUE(pTCB->cwnd, pTCB->RemoteWin))>>1; //慢启动门限取拥塞窗口和通告窗口的最小值
                  if (pTCB->ssthresh < ((pTCB->mss + 40)<<1)) //慢启动门限不得小于2个报文段大小
                  {
                     pTCB->ssthresh = (pTCB->mss + 40)<<1;
                  }         
                  pTCB->cwnd = pTCB->mss + 40; //拥塞窗口初始化,之后进行慢启动算法      
               }
            }
            else
            {
               pTCB->RTOCnt++;
            }
         }
      
         if(pTCB->State == TCP_STATE_LASTACK) //收到对方的fin,我方已经发送fin+ack,一旦超时仍未收到对方的ack则关闭连接
         {            
            if(pTCB->LastAckTimer == 0) //超时到,关闭连接并释放资源
            {
               TCPRelease(pTCB);      
            }
            else
            {
         &

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


tcp状态机改变的部分
      case TCP_STATE_ESTABLISHED: //状态为建立连接
         if ( ( pTCPHead->Flag & TCP_FIN ) != 0 ) //若收到对方的断开连接的报
         {            
            if(pTCB->InSending) //若此时该tcp正发送数据,那么至少要发送函数处理完不能破坏的变量,才能发送应答报,否则将破坏数据
            {
               pTCB->State = TCP_STATE_HALF_ESTABLISHED; //将状态变为半连接状态,此时我方仍可以发送数据
            }
            else
            {
               TCPSend(pMem, pTCB, TCP_FIN | TCP_ACK); //发送一个fin+ack报
               pTCB->State = TCP_STATE_LASTACK; //等待对方的ack报
               pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT; //设置等待ack的超时,若到超时还没有收到对方的ack,则状态变为关闭      
            }
         }
         break;
      case TCP_STATE_HALF_ESTABLISHED:
         if(!pTCB->InSending)
         {
            TCPSend(pMem, pTCB, TCP_FIN | TCP_ACK); //发送一个fin+ack报
            pTCB->State = TCP_STATE_LASTACK; //等待对方的ack报
            pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT; //设置等待ack的超时,若到超时还没有收到对方的ack,则状态变为关闭            
         }
         break;


其他基本没什么改变,虽然他写了注释,可是我还是不大明白为什么要添加一个半连接?zlip没有半连接也正常啊?



页: [1]
查看完整版本: 朋友移植的zlip源码