⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcp.lst

📁 51 单片机TCP_IP 协议栈ZLIP源码 单片机上网技术
💻 LST
📖 第 1 页 / 共 4 页
字号:
 729   1                      pTCB->SeqHis == pTCB->QExceedSeq->Seq)
 730   1              {
 731   2                      TCPRecvSeg(pTCB,pTCB->QExceedSeq->MemHead);
 732   2                      TCPOutQ(&(pTCB->QExceedSeq));
 733   2              }
 734   1      }
 735          
 736          BOOL TCPSendEx(struct STCB DT_XDATA * pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_MUL
 737          {
C51 COMPILER V7.07   TCP                                                                   01/14/2009 14:46:37 PAGE 13  

 738   1              /* if state is "closed, listen, syn recvd, syn sent", 
 739   1              need connected first */
 740   1              if(pTCB->TCPState <= TCP_STATE_SYNSENT)
 741   1              {
 742   2                      MemFree(MemHead);
 743   2                      return FALSE;
 744   2              }
 745   1              
 746   1              /* if unsend queue is empty */
 747   1              if(pTCB->QUnSend == NULL)
 748   1              {
 749   2                      /* if this packet send completely? */
 750   2                      if(TCPSendSegJudgeWnd(pTCB,MemHead) == FALSE)
 751   2                      {
 752   3                              /* insert the remain for later sending */
 753   3                              return TCPInsertQ(&(pTCB->QUnSend),MemHead,0);
 754   3                      }
 755   2                      else
 756   2                              return TRUE;
 757   2              }
 758   1              else
 759   1                      return TCPInsertQ(&(pTCB->QUnSend),MemHead,0);
 760   1      }
 761          
 762          BOOL TCPSend(struct STCB DT_XDATA * pTCB,void DT_XDATA *buf,WORD DataSize) REENTRANT_MUL
 763          {
 764   1              struct SMemHead DT_XDATA *MemHead;
 765   1              
 766   1              /* allocate */
 767   1              if((MemHead = TCPAllocate(DataSize)) == NULL)
 768   1                      return FALSE;
 769   1      
 770   1              /* copy */
 771   1              MemCopy(MemHead->pStart,buf,DataSize);
 772   1      
 773   1              return TCPSendEx(pTCB,MemHead);
 774   1      }
 775          
 776          BOOL TCPConnect(struct STCB DT_XDATA * pTCB, DWORD DestIP, WORD DestPort,                                               
 777                                                          void (DT_CODE * recv)(void DT_XDATA * buf,WORD size) REENTRANT_MUL,
 778                                                          void (DT_CODE * close)(struct STCB DT_XDATA * pSocket) REENTRANT_MUL) REENTRANT_SIG
 779          {
 780   1              /* is it in closed state? */
 781   1              if(pTCB->TCPState != TCP_STATE_CLOSED)
 782   1                      return FALSE;
 783   1      
 784   1              /* tcb renew */
 785   1              pTCB->IPDest    = htonl(DestIP);
 786   1              pTCB->PortDest  = htons(DestPort);
 787   1              pTCB->recv       = recv;
 788   1              pTCB->close      = close;
 789   1      
 790   1              /* send syn */
 791   1              if(TCPSendSeg(pTCB,TCPAllocate(0),TCP_SYN) == TRUE)
 792   1              {
 793   2                      pTCB->TCPState = TCP_STATE_SYNSENT;
 794   2      
 795   2                      /* wait for establish */
 796   2                      while(TRUE)
 797   2                      {
 798   3                              switch(pTCB->TCPState)
 799   3                              {
C51 COMPILER V7.07   TCP                                                                   01/14/2009 14:46:37 PAGE 14  

 800   4                              case TCP_STATE_ESTABLISHED:
 801   4                                      return TRUE;
 802   4                              case TCP_STATE_CLOSED:
 803   4                                      /* 1. if receive a rst packet from him
 804   4                                         2. retransmittimes exceed sreshold */
 805   4                                      return FALSE;
 806   4                              }
 807   3                      }
 808   2              }
 809   1              else
 810   1                      return FALSE;
 811   1      }
 812          /* call this func to innitiate closing a connection. connection
 813          will not close unless peer send a fin also.*/
 814          void TCPClose(struct STCB DT_XDATA *pTCB) REENTRANT_MUL
 815          {
 816   1              if(pTCB->TCPState != TCP_STATE_CLOSED)
 817   1              {
 818   2                      switch(pTCB->TCPState)
 819   2                      {
 820   3                      case TCP_STATE_LISTEN:
 821   3                              /* close right now */
 822   3                              pTCB->TCPState = TCP_STATE_CLOSED;
 823   3                              break;
 824   3                      case TCP_STATE_SYNRECVD:
 825   3                              /* close when peer send a fin */
 826   3                              pTCB->TCPState = TCP_STATE_FINWAIT1;
 827   3                              TCPSendSeg(pTCB,TCPAllocate(0),TCP_FIN | TCP_ACK);
 828   3                              break;
 829   3                      case TCP_STATE_SYNSENT:
 830   3                              /* close right now */
 831   3                              pTCB->TCPState = TCP_STATE_CLOSED;
 832   3                              TCPRelease(pTCB);
 833   3                              break;
 834   3                      case TCP_STATE_ESTABLISHED:
 835   3                              /* close when peer send a fin */
 836   3                              pTCB->TCPState = TCP_STATE_FINWAIT1;
 837   3                              TCPSendSeg(pTCB,TCPAllocate(0),TCP_FIN | TCP_ACK);
 838   3                              break;
 839   3                      case TCP_STATE_CLOSEWAIT:
 840   3                              /* close when lastack time out */
 841   3                              pTCB->TCPState = TCP_STATE_LASTACK;
 842   3                              pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;
 843   3                              TCPSendSeg(pTCB,TCPAllocate(0),TCP_FIN | TCP_ACK);
 844   3                              break;
 845   3                      }
 846   2              }
 847   1      }
 848          
 849          BOOL TCPListen(struct STCB DT_XDATA *pTCB,WORD ScrPort,
 850                                     void (DT_CODE * accept)(struct STCB DT_XDATA *pNewTCB) REENTRANT_MUL) REENTRANT_MUL
 851          {
 852   1              struct STCB DT_XDATA *pTCBt;
 853   1      
 854   1              /* is it in closed state? */
 855   1              if(pTCB->TCPState != TCP_STATE_CLOSED)
 856   1                      return FALSE;
 857   1      
 858   1              ScrPort = htons(ScrPort);
 859   1      
 860   1              /* is there any other socket already listen in this port? */
 861   1              for(pTCBt = TCBList; pTCBt != NULL; pTCBt = pTCBt->pNext)
C51 COMPILER V7.07   TCP                                                                   01/14/2009 14:46:37 PAGE 15  

 862   1              {
 863   2                      if(pTCBt->PortScr == ScrPort)
 864   2                              return FALSE;
 865   2              }
 866   1      
 867   1              /* renew tcb */
 868   1              pTCB->PortScr = ScrPort;
 869   1              pTCB->TCPState = TCP_STATE_LISTEN;
 870   1              pTCB->accept   = accept;
 871   1      
 872   1              return TRUE;
 873   1      }
 874          
 875          struct STCB DT_XDATA * TCPSocket(IP_ADDR ScrIP) REENTRANT_SIG
 876          {
 877   1              struct STCB DT_XDATA * pTCB;
 878   1              struct STCB DT_XDATA * pTCBt;
 879   1              WORD MaxScrPort;        /* max port number in use */
 880   1      
 881   1              /* get a tcb */
 882   1              if((pTCB = TCPGetTCB()) == NULL)
 883   1              {
 884   2                      return NULL;
 885   2              }
 886   1      
 887   1              /* allocate a scrport. that is number of 
 888   1              the highest     number of port in use add 1 */
 889   1              for(pTCBt = TCBList,MaxScrPort = TCP_DEFAULT_PORT;
 890   1                      pTCBt != NULL; pTCBt = pTCBt->pNext)
 891   1              {
 892   2                      if(ntohs(pTCBt->PortScr) > MaxScrPort)
 893   2                              MaxScrPort = ntohs(pTCBt->PortScr);
 894   2              }
 895   1              pTCB->PortScr = htons((WORD)(MaxScrPort + 1));
 896   1      
 897   1              /* other tcb set */
 898   1              pTCB->TCPState  = TCP_STATE_CLOSED;
 899   1              pTCB->IPScr             = htonl(ScrIP);
 900   1              pTCB->WndMine   = MemFreeSize();
 901   1              pTCB->bNeedAck  = FALSE;
 902   1              pTCB->QExceedSeq        = NULL;
 903   1              pTCB->QUnacked          = NULL;
 904   1              pTCB->QUnSend           = NULL;
 905   1      
 906   1              /* Insert int tcb */
 907   1              TCPInsertTCB(pTCB);
 908   1      
 909   1              return pTCB;
 910   1      }
 911          
 912          /* reclaim TCB */
 913          void TCPAbort(struct STCB DT_XDATA *pTCB) REENTRANT_SIG
 914          {
 915   1              struct STCB DT_XDATA *pTCBt;
 916   1      
 917   1              TCPRelease(pTCB);
 918   1      
 919   1              /*
 920   1               * search through the tcb list and delete it from list
 921   1               */
 922   1              /* if it is the hear of the list */
 923   1              if(TCBList == pTCB)
C51 COMPILER V7.07   TCP                                                                   01/14/2009 14:46:37 PAGE 16  

 924   1              {
 925   2                      TCBList = TCBList->pNext;
 926   2              }
 927   1              else
 928   1              {
 929   2                      /* else search start from the second one */
 930   2                      for(pTCBt = TCBList; pTCBt != NULL; pTCBt = pTCBt->pNext)
 931   2                      {
 932   3                              if(pTCBt->pNext == pTCB)
 933   3                              {
 934   4                                      pTCBt->pNext = pTCB->pNext;
 935   4                                      break;
 936   4                              }
 937   3                      }
 938   2              }
 939   1      
 940   1              /* reclaim it. link it to TCBFreelist */
 941   1              pTCB->pNext = TCBFreeList;
 942   1              TCBFreeList = pTCB;
 943   1      }
 944          /* this func is called by user to allocate a packet and pstart
 945          point to TCPplayload */
 946          struct SMemHead DT_XDATA *TCPAllocate(WORD size) REENTRANT_SIG
 947          {
 948   1              struct SMemHead DT_XDATA * MemHead;
 949   1              if((MemHead = MemAllocate((WORD)(ALL_HEAD_SIZE + size))) == NULL)
 950   1                      return NULL;
 951   1              else
 952   1              {
 953   2                      /* point to the tcp data */
 954   2                      MemHead->pStart += ALL_HEAD_SIZE;
 955   2                      return MemHead;
 956   2              }
 957   1      }
 958          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   7446    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   1476    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      28
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -