📄 tcp.c
字号:
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 + -