音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網
技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe

朋友移植的zlip源碼

作者:truve 欄目:ARM技術
朋友移植的zlip源碼
這里是一個朋友移植的zlip的定時器的源碼,他對zlip進行了改進,問題之一就是為什么他加入了半連接狀態(tài)的處理?zlip源碼并沒有這個狀態(tài)?

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需要發(fā)送延遲ack
         if (pTCB->State != TCP_STATE_HALF_ESTABLISHED) //半發(fā)送狀態(tài)不允許發(fā)送應答,因為這將關閉連接,而我方正在發(fā)送數據的函數會被破壞
         {
            if (pTCB->DelayAckTimer == 0) //若超時到則發(fā)送ack
            {  
               pMem->UsedSize = 0;          
               TCPSend(pMem, pTCB, TCP_ACK);
               pTCB->NeedSendACK = FALSE; //已經發(fā)送ack,不需要再次發(fā)送
               
               MemFree(pMem); //因為arp層可能緩存該報,需要釋放原來的內存重新獲取一個內存用于下一個tcp的延遲ack發(fā)送
               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,我方已經發(fā)送fin+ack,一旦超時仍未收到對方的ack則關閉連接
         {            
            if(pTCB->LastAckTimer == 0) //超時到,關閉連接并釋放資源
            {
               TCPRelease(pTCB);        
            }
            else
            {
           &
2樓: >>參與討論
truve
tcp狀態(tài)機改變的部分
      case TCP_STATE_ESTABLISHED: //狀態(tài)為建立連接
         if ( ( pTCPHead->Flag & TCP_FIN ) != 0 ) //若收到對方的斷開連接的報
         {            
            if(pTCB->InSending) //若此時該tcp正發(fā)送數據,那么至少要發(fā)送函數處理完不能破壞的變量,才能發(fā)送應答報,否則將破壞數據
            {
               pTCB->State = TCP_STATE_HALF_ESTABLISHED; //將狀態(tài)變?yōu)榘脒B接狀態(tài),此時我方仍可以發(fā)送數據
            }
            else
            {
               TCPSend(pMem, pTCB, TCP_FIN | TCP_ACK); //發(fā)送一個fin+ack報
               pTCB->State = TCP_STATE_LASTACK; //等待對方的ack報
               pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT; //設置等待ack的超時,若到超時還沒有收到對方的ack,則狀態(tài)變?yōu)殛P閉        
            }
         }
         break;
      case TCP_STATE_HALF_ESTABLISHED:
         if(!pTCB->InSending)
         {
            TCPSend(pMem, pTCB, TCP_FIN | TCP_ACK); //發(fā)送一個fin+ack報
            pTCB->State = TCP_STATE_LASTACK; //等待對方的ack報
            pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT; //設置等待ack的超時,若到超時還沒有收到對方的ack,則狀態(tài)變?yōu)殛P閉             
         }
         break;


其他基本沒什么改變,雖然他寫了注釋,可是我還是不大明白為什么要添加一個半連接?zlip沒有半連接也正常。

參與討論
昵稱:
討論內容:
 
 
相關帖子
菜鳥請教兩個問題
ARM入門求問?請大家?guī)椭x謝。。。!
請教STN液晶可以用單片機直接驅動嗎?
2006北京嵌入LINUX網友交流研討會。鄢醺澹
外擴16C554時進入中斷有問題,請熟家指點!
免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號