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

📄 tcp.c

📁 TI公司的DSP TMS320VC5402开发板的全套资料
💻 C
📖 第 1 页 / 共 3 页
字号:
              TCP_Send_Reset();
         }
         else                                         
              Delete_Socket();
    }
	//正确的帧
    else if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_SYN)	//收到SYN
    {
    	 //收到的TCP序号 
         TCPIRSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+2)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+3)));  
         TCPAckNr=TCPIRSeq+1;   //确认号等于收到的TCP序号加1                
         if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_ACK)	//收到ACK
         {
			  //未得到确认的TCP序号=收到的确认号,因为确认号等于对方收到的TCP序号加1
              TCPSent_UnAck=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+5)));  
//              Process_Resend_Buff();
         }
		 //如果收到ACK,那么TCPSent_UnAck和之前的TCPAcceptSeq一致,肯定有TCPSent_UnAck>TCPSegNr
         if(TCPSent_UnAck>=TCPSegNr)    //未得到确认的TCP序号>=上一次发送的TCP序号(等于的话是不是没有收到确认?)               
         {
              TCPIRSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+2)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+3)));   //TCP序号
              TCPAckNr=TCPIRSeq+1;  //确认号等于收到的TCP序号加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);	//从收到的帧中得到对方最大报文段长度
              }
			  //TCP的标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,则下一个数据报文段数据序号仍为TCPSendNextNr
              TCPSegNr=TCPSendNextNr;   //本次发送的TCP序号(TCPSendNextNr不用加1?)
//              TCPResendSeqNr=TCPSegNr;              
              Prepare_TCP_Frame(TCP_CODE_ACK);    //收到SYN、ACK,发送回一个ACK,连接就建立起来了 
              TCPStatus=TCP_STATE_ESTABLISHED;
              TCPConnected=1;   //连接已建立
         }
		 //只有没收到ACK才有可能有以下程序的执行
         else  //只收到SYN,同时打开,发送回SYN、ACK
         {
              TCPStatus=TCP_STATE_SYN_RCVD;
//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),TCPSendNextNr);
              WriteDWord((TxEthnetFrameBuffer+TCP_HEADER_START+4),TCPAckNr);
              *(TxEthnetFrameBuffer+TCP_HEADER_START+6)=SwapWord(0x7000|(TCP_CODE_SYN|TCP_CODE_ACK));
              *(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);	//MSS选项只出现在SYN帧中
              *(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);
         }
    }   
}

void TCP_Established(void)
{
    Uint32 TCPAcceptSeq;
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&(TCP_CODE_RST|TCP_CODE_SYN))
         Delete_Socket();
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_FIN)      //发送完
	{
    	if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+0)==TCPRemotePort)
    	{
         	TCPStatus=TCP_STATE_CLOSE_WAIT;                            //进入关闭状态
         	TCPAckNr++;
    	}
	}
    if(TCPRxDataLenth>0)
         RxTCPDataSuccess=1;                                        //接收数据成功,可以处理数据了
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_ACK)  //收到ACK,继续发送数据
    {
         TCPConnected=1;
         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;
//              Process_Resend_Buff();
         }
         if((TCPTxDataLenth>0)||(TCPStatus==TCP_STATE_CLOSE_WAIT))
         {
              TCPSegNr=TCPSendNextNr;
//              TCPResendSeqNr=TCPSegNr;
              TCPSendNextNr+=TCPTxDataLenth;    //下一次的TCP序号
              Prepare_TCP_Frame(TCP_CODE_ACK|TCP_CODE_PSH);
         }
    }
}

void TCP_Close_Wait(void)
{
    Uint32 TCPAcceptSeq;
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&(TCP_CODE_RST|TCP_CODE_SYN))
         Delete_Socket();
    else if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_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;
//             Process_Resend_Buff();
             Prepare_TCP_Frame(TCP_CODE_FIN);
             TCPStatus=TCP_STATE_LAST_ACK;
         }
    }
}

void TCP_Last_Ack(void)
{
    if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&(TCP_CODE_RST|TCP_CODE_SYN|TCP_CODE_ACK))
         Delete_Socket();
}

void Prepare_TCP_Frame(Uint16 TCPCode)
{
    Uint16 CalcCkSum;
//Ethnet
    memcpy((TxEthnetFrameBuffer+ETH_HEADER_START),&RemoteMAC,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+TCPTxDataLenth)*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),&RemoteIP,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(0x5000|TCPCode);
    *(TxEthnetFrameBuffer+TCP_HEADER_START+7)=SwapWord(1024);
    *(TxEthnetFrameBuffer+TCP_HEADER_START+8)=0;
    *(TxEthnetFrameBuffer+TCP_HEADER_START+9)=0;
    CalcCkSum = CalcCheckSum((TxEthnetFrameBuffer+TCP_HEADER_START),(TCP_HEADER_SIZE+TCPTxDataLenth),1,0);
    if(!CalcCkSum)
         CalcCkSum=0xFFFF;
    *(TxEthnetFrameBuffer+TCP_HEADER_START+8)=CalcCkSum;
    TxFrameSize=ETH_HEADER_SIZE+IP_HEADER_SIZE+TCP_HEADER_SIZE+TCPTxDataLenth;
    SendFrame(TxEthnetFrameBuffer,TxFrameSize);
}

void TCPActiveTxData(void)
{
    Uint16 i;
    
    for(i=0;i<10;i++)
         *(TxEthnetFrameBuffer+ETH_HEADER_SIZE+IP_HEADER_SIZE+TCP_HEADER_SIZE+i)=SwapWord(i+0x3030);  //传输数据00~09(注意传输字节顺序) 
    TCPTxDataLenth=i;	//i=10
    Prepare_TCP_Frame(TCP_CODE_PSH|TCP_CODE_ACK);
}

void RTL8019ActiveOpen(void)
{
//---------
    if(!ARPAnswerSuccessFlag)
         ArpRequest();	//如果是向PC发送数据,只知道IP地址,要先发送ARP得到PC地物理地址
//----------      
  
    if((ARPAnswerSuccessFlag)&&(!TCPActiveOpenFlag))
    {
         memcpy(&RemoteMAC,&RecdFrameMAC,3);
         memcpy(&RemoteIP,&RecdFrameIP,2);
         TCPRemotePort=1028;
         TCPActiveOpen();	//在此函数中将置TCPActiveOpenFlag=1
    }
   
    if(TCPConnected)	//如果已经建立连接
    {
         TCPActiveTxData();	//传输数据
         TxSuccessFlag=1;
    }
    if(TxSuccessFlag)
    {
         TCPTxDataLenth=0;
         Prepare_TCP_Frame(TCP_CODE_FIN|TCP_CODE_ACK);	//终止连接,在Delete_Socket()里将TCPConnected标志清除
         TCPStatus=TCP_STATE_LAST_ACK;
         TxSuccessFlag=0;    
    }
}



//======================= END ===============================

⌨️ 快捷键说明

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