| 无论嵌入式轻型tcp还是pc机上的,流控算法是他的关键,所以有的网上tcp就几百,有个tcp协议栈就可以上万,附带部分算法代码,如果有兴趣可以自己尝试完善zlgip<br /><br />/*==============================================================<br />Function:<br />Description: <br />Parameters:<br />Returns:<br />Notes:<br />==============================================================*/<br />static void TCPRecvSub(PNETBUF pBuf, PTCPINFO pTCP, PTCPHEAD pTCPHead)<br />{    <br />    if (pTCPHead->flag & TCP_RST){<br />    <br />        TCPSendCloseMsg(pTCP);<br />        <br />        return;<br />    }<br />      <br />       if (pTCPHead->flag & (TCP_FIN|TCP_SYN)){<br />   <br />          pTCP->nextRecvSeq ++;           <br />    }<br /><br />       if ((pTCPHead->flag & (TCP_FIN|TCP_SYN)) || pBuf->totLen){      <br />          <br />          pTCP->flag |= TCP_NEED_SENT_ACK;<br />          pTCP->delayAckTimer = TCP_FASTTIMO;<br />    }<br /><br />       if (pTCPHead->flag & TCP_ACK){<br />                     <br />          if (pTCPHead->ack != pTCP->lastACK){ <br />      <br />              TCPChkunAckedQueue(pTCP, pTCPHead->ack);<br />              <br />            TCPResetTimeout(pTCP);<br />            <br />             if (pTCP->dupACKs == 4){ /*快速恢复*/<br />      <br />                pTCP->cwnd = pTCP->ssthresh; <br />      <br />             }else{<br />            <br />                if (pTCP->cwnd < pTCP->ssthresh){/*慢启动*/<br />         <br />                       pTCP->cwnd += pTCP->mss; <br />                                <br />                }else{/*拥塞避免*/<br />               <br />                       pTCP->cwnd += pTCP->mss * pTCP->mss / pTCP->cwnd;<br />                }                <br />             }<br />         <br />             pTCP->lastACK = pTCPHead->ack; <br />             pTCP->dupACKs = 0;<br />      <br />          }else if (pTCP->unAckedQueue != NULL){<br />            <br />             switch (pTCP->dupACKs){<br />            <br />                case 3: /*快速重传*/<br />                       TCPSetSsthresh(pTCP, FALSE);<br />                       TCPXmit(pTCP, TRUE);<br />                       pTCP->dupACKs = 4;<br />                       break;<br />                case 4: <br />                case 5:<br />                       pTCP->cwnd += pTCP->mss;<br />                       pTCP->dupACKs = 5;                      <br />                       break;<br />                default:<br />                       pTCP->dupACKs++;<br />                       break;<br />             }  <br />          }              <br />       }<br />       <br />       TCPRenewCwnd(pTCP, pTCPHead->wndSize);          <br /><br />       switch (pTCP->state){<br />   <br />          case TCP_STATE_LISTEN:<br />             TCPListen(pBuf, pTCP, pTCPHead->flag);    <br />             break;<br />          case TCP_STATE_SYNRECVD:<br />             TCPSYNRecvd(pBuf, pTCP, pTCPHead->flag);    <br />             break;<br />          case TCP_STATE_SYNSEND:<br />             TCPSYNSend(pBuf, pTCP, pTCPHead->flag);    <br />             break;<br />          case TCP_STATE_ESTABLISHED:<br />             TCPEstablished(pBuf, pTCP, pTCPHead->flag);    <br />             break;<br />          case TCP_STATE_LASTACK:<br />             TCPRecvLastACK(pBuf, pTCP);    <br />             break;<br />          case TCP_STATE_FINWAIT1:<br />             TCPFinWait1(pBuf, pTCP, pTCPHead->flag);    <br />             break;<br />          case TCP_STATE_FINWAIT2:<br />             TCPFinWait2(pBuf, pTCP, pTCPHead->flag);    <br />             break;<br />          case TCP_STATE_CLOSING:<br />             TCPClosing(pBuf, pTCP, pTCPHead->flag);    <br />             break;<br />          default: <br />             break;<br />       }<br />}<br /><br /> |