|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe |
朋友移植的zlip源碼 |
| 作者:truve 欄目:ARM技術 |
這里是一個朋友移植的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 于 2006/1/29 21:51:00 發(fā)布:
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沒有半連接也正常。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |