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

📄 tcp.lst.svn-base

📁 数字广播系统的开发源码
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
 455   4                              }
 456   3      
 457   3                              /* insert this tcb to tcb list isn't need. because
 458   3                              this tcb is already insert at TCPSocket()*/
 459   3      
 460   3                              /* initial new tcb value*/
 461   3                              pNewTCB->TCPState       = TCP_STATE_SYNRECVD;
 462   3                              pNewTCB->IPDest         = pIPHead->IPScr;
 463   3                              pNewTCB->PortDest       = pTCPHead->PortScr;
 464   3                              pNewTCB->PortScr        = pTCPHead->PortDest;
 465   3      
 466   3                              pNewTCB->SeqHis = pTCPHead->Seq + 1;    /* syn is use 1
 467   3                                                                                                              sequence */
 468   3                              pNewTCB->WndHis = pTCPHead->WndSize;
 469   3      
 470   3                              /* set accept function. when pNewTCB accept this
 471   3                              connection call pTCB->accetp */
 472   3                              pNewTCB->accept = pTCB->accept;
 473   3      
 474   3                              /* send syn+ack */
 475   3                              TCPSendSeg(pNewTCB,TCPAllocate(0),TCP_SYN | TCP_ACK);
 476   3                      }
 477   2                      break;
 478   2              case TCP_STATE_SYNRECVD:
 479   2      
 480   2                      /* ack: to TCP_STATE_ESTABLISHED */
 481   2                      if((pTCPHead->flag & TCP_ACK) != 0)
 482   2                              pTCB->TCPState = TCP_STATE_ESTABLISHED;
 483   2      
 484   2                      /* call accept. Let user to know and deal more */
 485   2                      pTCB->accept(pTCB);
 486   2      
 487   2                      break;
 488   2              case TCP_STATE_SYNSENT:
C51 COMPILER V7.06   TCP                                                                   07/24/2007 16:32:43 PAGE 9   

 489   2                      switch(pTCPHead->flag)
 490   2                      {
 491   3                      case TCP_SYN:
 492   3                              /* syn: to TCP_STATE_SYNRECVD send syn+ack */
 493   3      
 494   3                              pTCB->TCPState = TCP_STATE_SYNRECVD;
 495   3      
 496   3                              /* ackseq initial */
 497   3                              pTCB->SeqHis = pTCPHead->Seq + 1;       /* syn use 1 sequence */
 498   3      
 499   3                              TCPSendSeg(pTCB,TCPAllocate(0), TCP_SYN | TCP_ACK);
 500   3                              break;
 501   3                      case TCP_SYN | TCP_ACK:
 502   3                              /* syn+ack: to TCP_STATE_ESTABLISHED send ack */
 503   3      
 504   3                              pTCB->TCPState = TCP_STATE_ESTABLISHED;
 505   3      
 506   3                              /* ackseq initial */
 507   3                              pTCB->SeqHis = pTCPHead->Seq + 1;       /* syn use 1 sequence */
 508   3      
 509   3                              TCPSendSeg(pTCB,TCPAllocate(0),TCP_ACK);
 510   3                              break;
 511   3                      case TCP_RST | TCP_ACK:
 512   3                              /* rst: to closed */
 513   3                              pTCB->TCPState = TCP_STATE_CLOSED;
 514   3                              TCPRelease(pTCB);
 515   3                              break;
 516   3                      }
 517   2                      break;
 518   2              case TCP_STATE_ESTABLISHED:
 519   2                      /* fin:to closewait send ack */
 520   2                      if((pTCPHead->flag & TCP_FIN) != 0)
 521   2                      {
 522   3                              pTCB->TCPState = TCP_STATE_CLOSEWAIT;
 523   3                              TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
 524   3      
 525   3                              /* call ->close() let user to know he want to close connection
 526   3                              user should call TCPClose() to close the connection in ->close */
 527   3                              pTCB->close(pTCB);
 528   3                      }
 529   2                      break;
 530   2              case TCP_STATE_CLOSEWAIT:
 531   2                      /* he want to close, send a fin to close */
 532   2                      pTCB->TCPState = TCP_STATE_LASTACK;
 533   2                      pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;
 534   2                      TCPSendSeg(pTCB,TCPAllocate(0), TCP_FIN | TCP_ACK);
 535   2                      break;
 536   2              case TCP_STATE_FINWAIT1:
 537   2                      switch(pTCPHead->flag)
 538   2                      {
 539   3                      case TCP_FIN:
 540   3                              /* fin: to TCP_STATE_CLOSING send ack */
 541   3                              pTCB->TCPState = TCP_STATE_CLOSING;
 542   3                              TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
 543   3                              break;
 544   3                      case TCP_FIN | TCP_ACK:
 545   3                              pTCB->TCPState = TCP_STATE_TIMEWAIT;
 546   3                              pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;      /* start timer */
 547   3                              TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
 548   3                              break;
 549   3                      case TCP_ACK:
 550   3                              pTCB->TCPState = TCP_STATE_FINWAIT2;
C51 COMPILER V7.06   TCP                                                                   07/24/2007 16:32:43 PAGE 10  

 551   3                              break;
 552   3                      }
 553   2                      break;
 554   2              case TCP_STATE_CLOSING:
 555   2                      /* ack:to TCP_STATE_CLOSED */
 556   2                      if(pTCPHead->flag & TCP_ACK)
 557   2                      {
 558   3                              pTCB->TCPState = TCP_STATE_TIMEWAIT;
 559   3                              pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;      /* start timer */
 560   3                      }
 561   2                      break;
 562   2              case TCP_STATE_FINWAIT2:
 563   2                      if(pTCPHead->flag & TCP_FIN)
 564   2                      {
 565   3                              pTCB->TCPState = TCP_STATE_TIMEWAIT;
 566   3                              pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;      /* start timer */
 567   3                              TCPSendSeg(pTCB,TCPAllocate(0), TCP_ACK);
 568   3                      }
 569   2                      break;
 570   2              }
 571   1      
 572   1              /*
 573   1               * put tcp data to uper layer
 574   1               */
 575   1              if(TCPDataSize != 0)
 576   1              {
 577   2                      pTCB->recv(MemHead->pStart + TCP_HEAD_LEN(pTCPHead),TCPDataSize);
 578   2              }
 579   1      
 580   1              /*
 581   1               * free this packet
 582   1               */
 583   1              MemFree(MemHead);
 584   1      }
 585          
 586          /* tcp packet in.*/
 587          void TCPInput(struct SMemHead xdata *MemHead) reentrant
 588          {
 589   1              struct SIPHead  xdata *pIPHead;
 590   1              struct STCPHead xdata *pTCPHead;
 591   1              struct STCB             xdata *pNewTCB;
 592   1              struct STCB     xdata *pTCB;
 593   1      
 594   1              pTCPHead = (struct STCPHead xdata *)(MemHead->pStart);
 595   1              pIPHead  = (struct SIPHead  xdata *)(MemHead->pStart - sizeof(struct SIPHead));
 596   1      
 597   1              /*
 598   1               * is check sum ok?
 599   1               */
 600   1              if(TCPCheckSum(pIPHead,ntohs(pIPHead->TotalLen) - IP_HEAD_MIN_LEN) != 0)
 601   1              {
 602   2                      MemFree(MemHead);
 603   2                      return;
 604   2              }
 605   1      
 606   1              /*
 607   1               * is there a connection can accept this tcp packet?
 608   1               */
 609   1      
 610   1              /* if is syn packet. a tcb in listen can accept it. */
 611   1              if(pTCPHead->flag == TCP_SYN)
 612   1              {
C51 COMPILER V7.06   TCP                                                                   07/24/2007 16:32:43 PAGE 11  

 613   2                      for(pTCB = TCBList; pTCB != NULL; pTCB = pTCB->pNext)
 614   2                      {
 615   3                              if(pTCB->TCPState == TCP_STATE_LISTEN &&
 616   3                                      pTCB->PortScr == pTCPHead->PortDest)
 617   3                              {
 618   4                                      break;
 619   4                              }
 620   3                      }
 621   2              }
 622   1              else
 623   1              {
 624   2                      /* search active connections. TCBState must not the
 625   2                      closed and listen state */
 626   2                      for(pTCB = TCBList; pTCB != NULL; pTCB = pTCB->pNext)
 627   2                      {
 628   3                              /* and the source ip, dest ip, source port, dest port
 629   3                                      must equal */
 630   3                              if(pTCB->PortScr == pTCPHead->PortDest &&
 631   3                                      pTCB->PortDest == pTCPHead->PortScr &&
 632   3                                      pTCB->TCPState != TCP_STATE_LISTEN &&
 633   3                                      pTCB->TCPState != TCP_STATE_CLOSED &&
 634   3                                      pTCB->IPScr  == pIPHead->IPDest &&
 635   3                                      pTCB->IPDest == pIPHead->IPScr)
 636   3                                      break;
 637   3      
 638   3                      }
 639   2              }
 640   1      
 641   1              /* can't find, and send a rst */
 642   1              if(pTCB == NULL)
 643   1              {
 644   2                      /* allocate a temp tcb for use */
 645   2                      pNewTCB = TCPSocket(ntohl(pIPHead->IPDest));
 646   2                      pNewTCB->IPDest         = pIPHead->IPScr;
 647   2                      pNewTCB->PortDest       = pTCPHead->PortScr;
 648   2                      pNewTCB->PortScr        = pTCPHead->PortDest;
 649   2      
 650   2                      /* set MemFree DataSize to 0 */
 651   2                      MemHead->pStart = MemHead->pEnd;
 652   2      
 653   2                      TCPSendSeg(pNewTCB,TCPAllocate(0),TCP_ACK | TCP_RST);
 654   2      
 655   2                      MemFree(MemHead);
 656   2                      TCPAbort(pNewTCB);
 657   2                      return;
 658   2              }
 659   1      
 660   1              /*
 661   1               *  is it a expected packet?
 662   1               */
 663   1              /* first change all necessary part to host order */
 664   1       #ifndef HOST_ORDER_AS_NET
                      pTCPHead->AckSeq        = ntohl(pTCPHead->AckSeq);
                      pTCPHead->Seq           = ntohl(pTCPHead->Seq);
                      pTCPHead->WndSize       = ntohs(pTCPHead->WndSize);
              #endif
 669   1      
 670   1              /* if it is the first packet from him, don't check sequence.
 671   1                 in connection case: a syn or syn+ack packet. in listen case
 672   1                 : a syn packet. so pass all packet contain syn flag */
 673   1              if((pTCPHead->flag & TCP_SYN) == 0)
 674   1              {
C51 COMPILER V7.06   TCP                                                                   07/24/2007 16:32:43 PAGE 12  

 675   2                      /* sequence ok? */
 676   2                      if(pTCB->SeqHis != pTCPHead->Seq)
 677   2                      {
 678   3                              /* if this a packet fall within rev window */
 679   3                              if(TCP_SEQ_COMPARE(pTCPHead->Seq,pTCB->SeqHis) > 0
 680   3                                      && TCP_SEQ_COMPARE(pTCPHead->Seq,pTCB->SeqHis) < pTCB->WndMine)
 681   3                              {
 682   4                                      /* write it to QExceedSeq for late receive */
 683   4                                      TCPInsertQ(&(pTCB->QExceedSeq),MemHead,pTCPHead->Seq);
 684   4                                      return;
 685   4                              }

⌨️ 快捷键说明

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