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

📄 tcp.lst

📁 我的网口控制程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 250   1              /* SeqMine increasment */
 251   1              if((TCPFlag & TCP_SYN) || (TCPFlag & TCP_FIN))
 252   1              {
 253   2                      SeqInc = MemHead->pEnd - MemHead->pStart + 1;
 254   2              }
 255   1              else
 256   1              {
 257   2                      SeqInc = MemHead->pEnd - MemHead->pStart;
 258   2              }
 259   1      
 260   1              pTCPHead = (struct STCPHead DT_XDATA *)(MemHead->pStart - sizeof(struct STCPHead));
 261   1              
 262   1              /* fill tcp header */
 263   1              pTCPHead->PortDest              = pTCB->PortDest;
 264   1              pTCPHead->PortScr               = pTCB->PortScr;
 265   1              pTCPHead->Seq                   = htonl(pTCB->SeqMine);
 266   1              pTCPHead->AckSeq                = htonl(pTCB->SeqHis);
 267   1              pTCPHead->TCPHeadLen    = (BYTE)(((BYTE)sizeof(struct STCPHead)/4)<<4);
 268   1              pTCPHead->flag                  = TCPFlag;
 269   1              pTCPHead->WndSize               = htons(pTCB->WndMine = MemFreeSize());
 270   1              pTCPHead->CheckSum              = 0;
 271   1              pTCPHead->UrgentPoint   = 0;
 272   1              
 273   1              /* fill some of IPHead. it will be used to calculate TCPChecksum
 274   1              and as augument passed to IPlayer */
 275   1              pIPHead = (struct SIPHead DT_XDATA *)((BYTE DT_XDATA *)pTCPHead - IP_HEAD_MIN_LEN);
 276   1              pIPHead->IPDest                                 = pTCB->IPDest;
 277   1              pIPHead->IPScr                                  = pTCB->IPScr;
 278   1              pIPHead->Protocol                               = IP_PROTOCOL_TCP;
 279   1              pIPHead->TotalLen                               = htons(MemHead->pEnd - 
 280   1                      MemHead->pStart + TCP_HEAD_MIN_LEN + IP_HEAD_MIN_LEN);  /* pStart point to TCP data */
 281   1              pTCPHead->CheckSum = htons(TCPCheckSum(pIPHead,MemHead->pEnd - MemHead->pStart + TCP_HEAD_MIN_LEN));
 282   1                      
 283   1              /* send packet */
 284   1              MemHead->pStart = (BYTE DT_XDATA *)pIPHead;     /* dec pStart */
 285   1              IPOutput(MemHead);
 286   1              
 287   1              /*
 288   1               * renew tcb 
 289   1               */
 290   1              /* no ack need. because this packet will give a ack to him */
 291   1              pTCB->bNeedAck = FALSE; 
 292   1      
 293   1              pTCB->SeqMine += SeqInc;
 294   1      
 295   1              /* if this packet contant data or is a FIN or SYN packet
 296   1              we write it to unacked queue */
 297   1              if(SeqInc != 0)
 298   1              {
 299   2                      /* if the unacked queue is empty, start timer for this packet */
 300   2                      if(pTCB->QUnacked == NULL)
 301   2                      {
 302   3                              pTCB->RetranTimer = TCP_RETRAN_TIME_OUT;
 303   3                              pTCB->RetranTimes = 0;
C51 COMPILER V7.06   TCP                                                                   11/06/2008 08:54:10 PAGE 6   

 304   3                      }
 305   2      
 306   2                      TCPInsertQ(&(pTCB->QUnacked),MemHead,htonl(pTCPHead->Seq));
 307   2              }
 308   1              else
 309   1              {
 310   2                      MemFree(MemHead);
 311   2              }
 312   1              return TRUE;
 313   1      }
 314          
 315          /* judge his wnd if he can receive this packet. send call TCPSendSeg.
 316          only send this seg completely return TRUE*/
 317          BOOL TCPSendSegJudgeWnd(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_MUL
 318          {
 319   1              struct SMemHead DT_XDATA *NewMemHead;
 320   1              
 321   1              /* if WndHis is large enough to receive this packet send it.
 322   1              otherwise create a new packet and send part of Data. the remain
 323   1              going to transmit when WndHis refresh at TCPInput */
 324   1              if(MemHead->pEnd - MemHead->pStart > pTCB->WndHis)
 325   1              {
 326   2                      /* part of Data need send */
 327   2                      if(pTCB->WndHis > 0)
 328   2                      {
 329   3                              /* create a new MemHead */
 330   3                              if((NewMemHead = TCPAllocate(pTCB->WndHis)) == NULL)
 331   3                                      return FALSE;
 332   3              
 333   3                              /* copy part of data to new MemHead */
 334   3                              MemCopy(NewMemHead->pStart,MemHead->pStart,pTCB->WndHis);
 335   3      
 336   3                              /* delete this part from old MemHead */
 337   3                              MemHead->pStart += pTCB->WndHis;
 338   3      
 339   3                              /* send the NewMemHead */
 340   3                              TCPSendSeg(pTCB,NewMemHead,TCP_ACK);
 341   3      
 342   3                              return FALSE;
 343   3                      }
 344   2                      else
 345   2                      {
 346   3                              /* can't send any data now */
 347   3                              return FALSE;
 348   3                      }
 349   2              }
 350   1              else
 351   1              {
 352   2                      TCPSendSeg(pTCB,MemHead,TCP_ACK);
 353   2                      return TRUE;
 354   2              }
 355   1      }
 356          
 357          /* send seg in unsend queue untill can't send any more. if send all
 358          seg in queue return true */
 359          BOOL TCPSendUnsendQ(struct STCB DT_XDATA *pTCB) REENTRANT_MUL
 360          {
 361   1              /* send every packet in unsend queue if can */
 362   1              for(;pTCB->QUnSend != NULL;)
 363   1              {
 364   2                      /* send it completely? */
 365   2                      if(TCPSendSegJudgeWnd(pTCB,pTCB->QUnSend->MemHead) == TRUE)
C51 COMPILER V7.06   TCP                                                                   11/06/2008 08:54:10 PAGE 7   

 366   2                      {
 367   3                              /* delete it from unsend queue */
 368   3                              TCPOutQ(&(pTCB->QUnSend));
 369   3                      }
 370   2                      else
 371   2                      {
 372   3                              /* only part of the seg is send */
 373   3                              return FALSE;
 374   3                      }
 375   2              }
 376   1              return TRUE;
 377   1      }
 378          
 379          /* call by TCPInput after judge this packet can be received.NOTE:MemHead-pStart point 
 380          to TCP head. TCPHead byte order is change in TCPInput */
 381          void TCPRecvSeg(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_SIG
 382          {
 383   1              WORD TCPDataSize;
 384   1              struct STCB DT_XDATA *pNewTCB;
 385   1              struct SIPHead  DT_XDATA *pIPHead;
 386   1              struct STCPHead DT_XDATA *pTCPHead;
 387   1      
 388   1              pTCPHead = (struct STCPHead DT_XDATA *)(MemHead->pStart );
 389   1              pIPHead  = (struct SIPHead  DT_XDATA *)(MemHead->pStart - IP_HEAD_MIN_LEN);
 390   1      
 391   1              /*
 392   1               * begain renew tcb values
 393   1               */
 394   1      
 395   1              /* dest windows size renew.*/
 396   1              pTCB->WndHis = pTCPHead->WndSize;
 397   1      
 398   1              /* after dest windows renew is it possible to send a packet in unsend queue now ?*/
 399   1              TCPSendUnsendQ(pTCB);
 400   1                      
 401   1              /* His Sequence renew */
 402   1              TCPDataSize = ntohs(pIPHead->TotalLen) - IP_HEAD_MIN_LEN 
 403   1                      - TCP_HEAD_LEN(pTCPHead);
 404   1              if((pTCPHead->flag & TCP_SYN)  || (pTCPHead->flag & TCP_FIN))
 405   1              {
 406   2                      pTCB->SeqHis += TCPDataSize + 1;
 407   2              }
 408   1              else
 409   1              {
 410   2                      pTCB->SeqHis += TCPDataSize;
 411   2              }
 412   1      
 413   1              /* NeedAck? */
 414   1              if(TCPDataSize != 0)
 415   1              {
 416   2                      pTCB->bNeedAck = TRUE;
 417   2                      pTCB->DelayAckTimer = TCP_DELAY_ACK_TIME_OUT;
 418   2              }
 419   1              
 420   1              /* if This packet acked packet in unacked queue */
 421   1              if((pTCPHead->flag & TCP_ACK) != 0)
 422   1              {       
 423   2                      while(pTCB->QUnacked != NULL &&
 424   2                              TCP_SEQ_COMPARE(pTCB->QUnacked->Seq,pTCPHead->AckSeq) < 0)
 425   2                      {
 426   3                              MemFree(pTCB->QUnacked->MemHead); 
 427   3                              TCPOutQ(&(pTCB->QUnacked));     
C51 COMPILER V7.06   TCP                                                                   11/06/2008 08:54:10 PAGE 8   

 428   3                              
 429   3                              /* timer for retran restore */
 430   3                              pTCB->RetranTimer = TCP_RETRAN_TIME_OUT;
 431   3                              pTCB->RetranTimes = 0;
 432   3                      }
 433   2              }
 434   1              
 435   1              /*
 436   1               * deal refer to tcb.state and tcp flag
 437   1               */
 438   1              switch(pTCB->TCPState)
 439   1              {
 440   2              case TCP_STATE_CLOSED:
 441   2                      break;
 442   2              case TCP_STATE_LISTEN:
 443   2                      /* syn: to TCP_STATE_SYNSENT, send syn+ack */
 444   2                      if(pTCPHead->flag == TCP_SYN)
 445   2                      {
 446   3                              /* create a new tcb and it is going to deal with 
 447   3                              this connection. */
 448   3                              if((pNewTCB = TCPSocket(htonl(pTCB->IPScr))) == NULL)
 449   3                              {
 450   4                                      MemFree(MemHead);
 451   4                                      return;
 452   4                              }
 453   3      
 454   3                              /* insert this tcb to tcb list isn't need. because
 455   3                              this tcb is already insert at TCPSocket()*/
 456   3      
 457   3                              /* initial new tcb value*/
 458   3                              pNewTCB->TCPState       = TCP_STATE_SYNRECVD;
 459   3                              pNewTCB->IPDest         = pIPHead->IPScr;
 460   3                              pNewTCB->PortDest       = pTCPHead->PortScr;
 461   3                              pNewTCB->PortScr        = pTCPHead->PortDest;
 462   3      
 463   3                              pNewTCB->SeqHis = pTCPHead->Seq + 1;    /* syn is use 1 
 464   3                                                                                                              sequence */
 465   3                              pNewTCB->WndHis = pTCPHead->WndSize;
 466   3      
 467   3                              /* set accept function. when pNewTCB accept this
 468   3                              connection call pTCB->accetp */
 469   3                              pNewTCB->accept = pTCB->accept;                 
 470   3      
 471   3                              /* send syn+ack */
 472   3                              TCPSendSeg(pNewTCB,TCPAllocate(0),TCP_SYN | TCP_ACK);
 473   3                      }
 474   2                      break;
 475   2              case TCP_STATE_SYNRECVD:
 476   2      
 477   2                      /* ack: to TCP_STATE_ESTABLISHED */
 478   2                      if((pTCPHead->flag & TCP_ACK) != 0)
 479   2                              pTCB->TCPState = TCP_STATE_ESTABLISHED;
 480   2      
 481   2                      /* call accept. Let user to know and deal more */
 482   2                      pTCB->accept(pTCB);
 483   2      
 484   2                      break;
 485   2              case TCP_STATE_SYNSENT:
 486   2                      switch(pTCPHead->flag)
 487   2                      {
 488   3                      case TCP_SYN:
 489   3                              /* syn: to TCP_STATE_SYNRECVD send syn+ack */
C51 COMPILER V7.06   TCP                                                                   11/06/2008 08:54:10 PAGE 9   

 490   3      
 491   3                              pTCB->TCPState = TCP_STATE_SYNRECVD;
 492   3      
 493   3                              /* ackseq initial */
 494   3                              pTCB->SeqHis = pTCPHead->Seq + 1;       /* syn use 1 sequence */
 495   3      
 496   3                              TCPSendSeg(pTCB,TCPAllocate(0), TCP_SYN | TCP_ACK);
 497   3                              break;
 498   3                      case TCP_SYN | TCP_ACK: 
 499   3                              /* syn+ack: to TCP_STATE_ESTABLISHED send ack */
 500   3              
 501   3                              pTCB->TCPState = TCP_STATE_ESTABLISHED;
 502   3      
 503   3                              /* ackseq initial */
 504   3                              pTCB->SeqHis = pTCPHead->Seq + 1;       /* syn use 1 sequence */
 505   3      
 506   3                              TCPSendSeg(pTCB,TCPAllocate(0),TCP_ACK);
 507   3                              break;

⌨️ 快捷键说明

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