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

📄 tcp.c

📁 TI公司的DSP TMS320VC5402开发板的全套资料
💻 C
📖 第 1 页 / 共 3 页
字号:

void Process_TCP_Timeout(void)
{
    TCPTimeout=0;                         //超时标志清零
    Process_Resend_Buff();
    if((TCPStatus == TCP_STATE_ESTABLISHED) || (TCPStatus == TCP_STATE_CLOSE_WAIT))
    {
    	TCPSendNextNr += TCPTxDataLenth;
    	Prepare_TCP_Frame(TCP_CODE_ACK | TCP_CODE_PSH);
    }
    if(TCPStatus == TCP_STATE_TIME_WAIT)
    	Delete_Socket();
    if(TCPStatus == TCP_STATE_CLOSE_WAIT)
    {
    	TCPTxDataLenth = 0;
        Prepare_TCP_Frame(TCP_CODE_FIN | TCP_CODE_ACK);
        TCPStatus = TCP_STATE_LAST_ACK;    
    }
}

/*
                              +---------+ ---------\      active OPEN  
                              |  CLOSED |            \    -----------  
                              +---------+<---------\   \   create TCB  
                                |     ^              \   \  snd SYN    
                   passive OPEN |     |   CLOSE        \   \           
                   ------------ |     | ----------       \   \         
                    create TCB  |     | delete TCB         \   \       
                                V     |                      \   \     
                              +---------+            CLOSE    |    \   
                              |  LISTEN |          ---------- |     |  
                              +---------+          delete TCB |     |  
                   rcv SYN      |     |     SEND              |     |  
                  -----------   |     |    -------            |     V  
 +---------+      snd SYN,ACK  /       \   snd SYN          +---------+
 |         |<-----------------           ------------------>|         |
 |   SYN   |                    rcv SYN                     |   SYN   |
 |   RCVD  |<-----------------------------------------------|   SENT  |
 |         |                    snd ACK                     |         |
 |         |------------------           -------------------|         |
 +---------+   rcv ACK of SYN  \       /  rcv SYN,ACK       +---------+
   |           --------------   |     |   -----------                  
   |                  x         |     |     snd ACK                    
   |                            V     V                                
   |  CLOSE                   +---------+                              
   | -------                  |  ESTAB  |                              
   | snd FIN                  +---------+                              
   |                   CLOSE    |     |    rcv FIN                     
   V                  -------   |     |    -------                     
 +---------+          snd FIN  /       \   snd ACK          +---------+
 |  FIN    |<-----------------           ------------------>|  CLOSE  |
 | WAIT-1  |------------------                              |   WAIT  |
 +---------+          rcv FIN  \                            +---------+
   | rcv ACK of FIN   -------   |                            CLOSE  |  
   | --------------   snd ACK   |                           ------- |  
   V        x                   V                           snd FIN V  
 +---------+                  +---------+                   +---------+
 |FINWAIT-2|                  | CLOSING |                   | LAST-ACK|
 +---------+                  +---------+                   +---------+
   |                rcv ACK of FIN |                 rcv ACK of FIN |  
   |  rcv FIN       -------------- |    Timeout=2MSL -------------- |  
   |  -------              x       V    ------------        x       V  
    \ snd ACK                 +---------+delete TCB         +---------+
     ------------------------>|TIME WAIT|------------------>| CLOSED  |
                              +---------+                   +---------+
*/
void Process_TCP_Frame(void)
{
    Uint16 TCPOptionLenth;
    
    TCPTimeout = 0;
    TCPResendCount = 20;
    TCPResendNumFlag = 0;
    CopyFrameFromBE(RTL8019_HEADER_SIZE + TCP_HEADER_START, 10);
    TCPOptionLenth = (*(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + TCP_HEADER_START + 6) >> 12) * 2 - 10;
    if(TCPOptionLenth)    
    	CopyFrameFromBE((RTL8019_HEADER_SIZE + TCP_HEADER_START + TCP_HEADER_SIZE), TCPOptionLenth);
    TCPRxDataLenth = RecdIpFrameLenth - IP_HEADER_SIZE-TCP_HEADER_SIZE - TCPOptionLenth;
    TCPRemotePort = *(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + TCP_HEADER_START);	//接收到的源端口,返回数据时作为目的端口
    if((MyIP[0] == *(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + IP_HEADER_START + 8)) && (MyIP[1] == *(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + IP_HEADER_START + 9)))   
    {
    	if(*(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + TCP_HEADER_START + 1) == MY_TCP_PORT)	//目的端口与本机端口相等
        {
        	switch(TCPStatus)
            {
             	case 0: TCP_Listen();				//TCP_STATE_LISTEN,
          			break;
 		        case 1: TCP_Syn_Rec();				//TCP_STATE_SYN_RCVD,收到SYN帧后,被动打开后处于此状态
           			break;
		        case 2: TCP_Syn_Sent();				//TCP_STATE_SYN_SENT,主动打开后处于此状态
           			break;
		        case 3: TCP_Established();			//TCP_STATE_ESTABLISHED
           			break;
 		        case 7: TCP_Close_Wait();			//TCP_STATE_CLOSE_WAIT
           			break;
 		        case 8: TCP_Last_Ack();             //TCP_STATE_LAST_ACK
           			break;
            }
        }     
    }
}

/*
	       |                         |LISTEN
           |         SYN J           |
   SYN_SENT|------------------------>|SYN_RECVD
           |     SYN K,ACK J+1       |
ESTABLISHED|<------------------------|
           |        ACK K+1          |
           |------------------------>|ESTABLISHED
           |           .             |
           |           .             |
		   |           .             |
           |         FIN M           |
 FIN_WAIT_1|------------------------>|CLOSE_WAIT
           |        ACK M+1          |
 FIN_WAIT_2|<------------------------|
           |         FIN N           |
  TIME_WAIT|<------------------------|LAST_ACK
           |        ACK N+1          |
           |------------------------>|CLOSED
*/
void TCP_Listen(void)
{
    Uint16 Temp,CalcCkSum;
    if(*(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + TCP_HEADER_START + 6) & TCP_CODE_SYN)	//SYN位为1
	{
    	TCPIRSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+2)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+3)));
        TCPAckNr=TCPIRSeq+1;    //收到的对方的TCP序号+1 
        TCPSegNr=TCPSendNextNr; //本次发送的序号,随机取一个
        TCPSent_UnAck=TCPSegNr; //未得到确认的TCP序号
        TCPSendNextNr=TCPSegNr+1;   //下次发送的序号
        DestMaxSegSize=560;
        if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+10)==0x0204)
        {
        	Temp=*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+11);
            DestMaxSegSize=(Temp>>8)*256+(Temp&0xFF);
        }
		//Ethnet
        memcpy((TxEthnetFrameBuffer+ETH_HEADER_START),&RecdFrameMAC,3);
        memcpy((TxEthnetFrameBuffer+ETH_HEADER_START+3),&MyMAC,3);
        *(TxEthnetFrameBuffer+ETH_HEADER_START+6)=SwapWord(Frame_IP);

		//IP
        *(TxEthnetFrameBuffer+IP_HEADER_START+0)=SwapWord(Ip_Edition);
        *(TxEthnetFrameBuffer+IP_HEADER_START+1)=SwapWord((IP_HEADER_SIZE+TCP_HEADER_SIZE+4)*2);
        *(TxEthnetFrameBuffer+IP_HEADER_START+2)=0;
        *(TxEthnetFrameBuffer+IP_HEADER_START+3)=0;
        *(TxEthnetFrameBuffer+IP_HEADER_START+4)=SwapWord((DEFUALT_TTL<<8)|PROTOCOL_TCP);
        *(TxEthnetFrameBuffer+IP_HEADER_START+5)=0;
        memcpy((TxEthnetFrameBuffer+IP_HEADER_START+6),&MyIP,2);
        memcpy((TxEthnetFrameBuffer+IP_HEADER_START+8),&RecdFrameIP,2);
        CalcCkSum=CalcCheckSum((TxEthnetFrameBuffer+IP_HEADER_START),IP_HEADER_SIZE,0,0);
        if(!CalcCkSum)
        	CalcCkSum=0xFFFF;
        *(TxEthnetFrameBuffer+IP_HEADER_START+5)=CalcCkSum;

		//TCP
        *(TxEthnetFrameBuffer+TCP_HEADER_START+0)=SwapWord(MY_TCP_PORT);
        *(TxEthnetFrameBuffer+TCP_HEADER_START+1)=SwapWord(TCPRemotePort);
        WriteDWord((TxEthnetFrameBuffer+TCP_HEADER_START+2),TCPSegNr);
        WriteDWord((TxEthnetFrameBuffer+TCP_HEADER_START+4),TCPAckNr);
        *(TxEthnetFrameBuffer+TCP_HEADER_START+6)=SwapWord(0x7000|(TCP_CODE_SYN|TCP_CODE_ACK));	//SYN位及ACK位均置1
        *(TxEthnetFrameBuffer+TCP_HEADER_START+7)=SwapWord(1024);
        *(TxEthnetFrameBuffer+TCP_HEADER_START+8)=0;
        *(TxEthnetFrameBuffer+TCP_HEADER_START+9)=0;
        *(TxEthnetFrameBuffer+TCP_HEADER_START+10)=SwapWord(0x0204);
        *(TxEthnetFrameBuffer+TCP_HEADER_START+11)=SwapWord(MY_MAX_SEG_SIZE);
        *(TxEthnetFrameBuffer+TCP_HEADER_START+12)=SwapWord(0x0101);
        *(TxEthnetFrameBuffer+TCP_HEADER_START+13)=SwapWord(0x0101);
        CalcCkSum = CalcCheckSum((TxEthnetFrameBuffer+TCP_HEADER_START),14,1,0);
        if(!CalcCkSum)
        	CalcCkSum=0xFFFF;
        *(TxEthnetFrameBuffer+TCP_HEADER_START+8)=CalcCkSum;

        TxFrameSize=ETH_HEADER_SIZE+IP_HEADER_SIZE+14;
        SendFrame(TxEthnetFrameBuffer,TxFrameSize);	//收到连接请求报文,发送确认,SYN及ACK要置1
        TCPStatus=TCP_STATE_SYN_RCVD; //进入SYN_RCVD状态                                             
    }
    else if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6) & TCP_CODE_RST)
        ;
    else
        TCP_Send_Reset();
}

void TCP_Syn_Rec(void)
{
    Uint32 TCPAcceptSeq;
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6) & (TCP_CODE_RST | TCP_CODE_SYN))
    	TCP_Send_Reset();
    else if(*(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + TCP_HEADER_START + 6) & TCP_CODE_ACK)	//收到ACK,不发送
    {
         TCPAcceptSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+5)));
         if((TCPSent_UnAck<=TCPAcceptSeq)&&(TCPAcceptSeq<=TCPSendNextNr))
         {
              TCPSent_UnAck=TCPAcceptSeq;
//------------
//              TCPResendSeqNr=TCPSegNr;
//------------
              TCPStatus=TCP_STATE_ESTABLISHED;
              TCPConnected=1;
         }
    }
}

void TCP_Syn_Sent(void)
{
    Uint16 CalcCkSum,Temp;
    Uint32 TCPAcceptSeq;
    TCPAcceptSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+5)));     //32位确认号
	//收到的确认号<=发送的TCP序号 或者 收到的确认号>下一次要发送帧的TCP序号同时这个收到的帧是ACK
    if((TCPAcceptSeq<=TCPSegNr)||((TCPAcceptSeq>TCPSendNextNr)&&(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_ACK)))
    {    
         if(!(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_RST))
         {                                            
              memcpy((TxEthnetFrameBuffer+TCP_HEADER_START+2),(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4),2);
              *(TxEthnetFrameBuffer+TCP_HEADER_START+4)=0;
              *(TxEthnetFrameBuffer+TCP_HEADER_START+6)|=TCP_CODE_RST;

⌨️ 快捷键说明

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