?? tcp.c
字號:
//Send_Reset(num);
}
else if(Tcp_Packed.Tcp.control&(TCP_SYN))//收到同步信號
{
TcpStatus[num].RecPassAck=Tcp_Packed.Tcp.AckNum;//確認
TcpStatus[num].RecPassSeq=Tcp_Packed.Tcp.SeqNum;//對方的初始化順序號
TcpStatus[num].SenPassSeq=TcpStatus[num].RecPassAck;
TcpStatus[num].SenPassAck=TcpStatus[num].RecPassSeq;//我的順序號,用于發送
TcpHeadHandle(num ,0x5000+TCP_RST);//headlength 0x20,
TcpStatus[num].TcpDHeadUint8[2]=0;
TcpStatus[num].TcpDHeadUint8[3]=20;
Tcp_Packed.TcpDHead.TotalLen=20;
Tcp_Packed.Tcp.Crc=CheckSumTcp1(num,32);//12+28
TcpStatus[num].TcpHeadUint8[16]=(Tcp_Packed.Tcp.Crc&0xff00)>>8;;
TcpStatus[num].TcpHeadUint8[17]=Tcp_Packed.Tcp.Crc&0x00ff;
TxdData.STPTR=NULL;
TxdData.length=20;
TxdData.DAPTR=TcpStatus[num].TcpHeadUint8;
Send_Ip_Frame
(
&TxdData,
TcpStatus[num].Dest_Ip,
TcpStatus[num].My_Ip,
6
);
Delete_Socket(num);
//Tcp_Listen(num) ;
//Send_Reset(num);
}
else if(Tcp_Packed.Tcp.control&TCP_ACK)//表示這是一個3次握手的確認表明連接建立
{
if((TcpStatus[num].SenPassSeq<=Tcp_Packed.Tcp.AckNum)
&&(Tcp_Packed.Tcp.AckNum<=TcpStatus[num].RecFutureAck))
{
TcpStatus[num].RecPassAck=Tcp_Packed.Tcp.AckNum;//確認
TcpStatus[num].RecPassSeq=Tcp_Packed.Tcp.SeqNum;//確認
TcpStatus[num].State=TCP_STATE_ESTABLISHED;//tcp_syn_established;
if((TcpStatus[num].StaSem&0x02)==0x02)
OSSemPost(AppSemCon[num]);
//TcpConnected=1;
}
}
}
uint8 Tcp_SYN_Sent(uint8 num)
{
static uint32 initalseq=32451;
struct _pkst TxdData;
if((Tcp_Packed.Tcp.control&TCP_SYN)&&(Tcp_Packed.Tcp.control&TCP_ACK))
{
if(TcpStatus[num].RecFutureAck<=Tcp_Packed.Tcp.AckNum)
{
TcpStatus[num].RecPassAck=Tcp_Packed.Tcp.AckNum;//確認
TcpStatus[num].RecPassSeq=Tcp_Packed.Tcp.SeqNum;//對方的初始化順序號
TcpStatus[num].SenPassSeq=TcpStatus[num].RecPassAck;
TcpStatus[num].SenPassAck=TcpStatus[num].RecPassSeq+1;//我的順序號,用于發送
TcpStatus[num].My_Wl1=TcpStatus[num].RecPassSeq;//seq
TcpStatus[num].Rcv_Window=Tcp_Packed.Tcp.window;//對方的WINDOW大小
TcpStatus[num].Dest_Max_Seg_Size=MAX_TCP_DATA;//默認為560
if(Tcp_Packed.Tcp.offset>20)
if(Tcp_Packed.Tcp.tcpdata[0]==0x02)
if(Tcp_Packed.Tcp.tcpdata[1]==0x04) //0204為最大segment選項
{
TcpStatus[num].Dest_Max_Seg_Size=Tcp_Packed.Tcp.tcpdata[2]*256+Tcp_Packed.Tcp.tcpdata[3];
}
//********************************************//
TcpHeadHandle(num ,0x5000+TCP_ACK);
TcpStatus[num].TcpDHeadUint8[2]=0;
TcpStatus[num].TcpDHeadUint8[3]=20;
Tcp_Packed.Tcp.Crc=CheckSumTcp1(num,32);//12+28
TcpStatus[num].TcpHeadUint8[16]=(Tcp_Packed.Tcp.Crc&0xff00)>>8;;
TcpStatus[num].TcpHeadUint8[17]=Tcp_Packed.Tcp.Crc&0x00ff;
TxdData.STPTR=NULL;
TxdData.length=20;
TxdData.DAPTR=TcpStatus[num].TcpHeadUint8;
Send_Ip_Frame
(
&TxdData,
TcpStatus[num].Dest_Ip,
TcpStatus[num].My_Ip,
6
);
TcpStatus[num].State=TCP_STATE_ESTABLISHED;
if((TcpStatus[num].StaSem&0x02)==0x02)
OSSemPost(AppSemCon[num]);
return (0);
}
return (0);
}
else if(Tcp_Packed.Tcp.control&TCP_SYN)
{
TcpStatus[num].State=TCP_STATE_SYN_RCVD;//TCP_STATE_SYN_RCVD;//Tcp_SYN_Rec;
//TcpStatus[num].Dest_Ip[0]=Tcp_Packed.TcpDHead.DestId[0];
//TcpStatus[num].Dest_Ip[1]=Tcp_Packed.TcpDHead.DestId[1];
//TcpStatus[num].Dest_Ip[2]=Tcp_Packed.TcpDHead.DestId[2];
//TcpStatus[num].Dest_Ip[3]=Tcp_Packed.TcpDHead.DestId[3];
TcpStatus[num].Dest_Port=Tcp_Packed.Tcp.SourcePort;//對方端口
//TcpStatus[num].My_Port=Tcp_Packed.Tcp.DestPort;
TcpStatus[num].IRS=Tcp_Packed.Tcp.SeqNum;//對方的初始化順序號
TcpStatus[num].RecPassSeq=Tcp_Packed.Tcp.SeqNum;
TcpStatus[num].RecPassAck=0;
TcpStatus[num].SenPassSeq=initalseq;
TcpStatus[num].SenPassAck=TcpStatus[num].RecPassSeq+1;
TcpStatus[num].RecFutureAck=initalseq+1;
TcpStatus[num].SenFutureSeq=initalseq+1;
TcpStatus[num].Rcv_Next=Tcp_Packed.Tcp.SeqNum+1;//對方的順序號,用于確認
TcpStatus[num].ISS=TcpStatus[num].Send_Next;//我的初始化順序號
TcpStatus[num].Sent_UnAck=TcpStatus[num].ISS;//我的未確認得序號
TcpStatus[num].Send_Next=TcpStatus[num].ISS+1;//我的順序號,用于發送
TcpStatus[num].My_Wl1=Tcp_Packed.Tcp.SeqNum;//seq
TcpStatus[num].My_Wl2=TcpStatus[num].Send_Next;
TcpStatus[num].Rcv_Window=Tcp_Packed.Tcp.window;//對方的WINDOW大小
TcpStatus[num].Snd_Window=MAX_TCP_DATA;//通知對方本地最大接收1024字節的包,用于流控
TcpStatus[num].Dest_Max_Seg_Size=MAX_TCP_DATA;//默認為560
if(Tcp_Packed.Tcp.offset>50)
if(Tcp_Packed.Tcp.tcpdata[0]==0x02)
if(Tcp_Packed.Tcp.tcpdata[1]==0x04) //0204為最大segment選項
{
TcpStatus[num].Dest_Max_Seg_Size=Tcp_Packed.Tcp.tcpdata[2]*256+Tcp_Packed.Tcp.tcpdata[3];
}
TcpStatus[num].My_Max_Seg_Size=MAX_TCP_DATA;//本地機可以接受最大的以太網數據包
//********************************************//
TcpStatus[num].TcpHeadUint8[0]=(TcpStatus[num].My_Port&0xff00)>>8;
TcpStatus[num].TcpHeadUint8[1]=TcpStatus[num].My_Port&0x00ff;
Tcp_Packed.Tcp.SourcePort=TcpStatus[num].My_Port;
TcpStatus[num].TcpHeadUint8[2]=(TcpStatus[num].Dest_Port&0xff00)>>8;
TcpStatus[num].TcpHeadUint8[3]=TcpStatus[num].Dest_Port&0x00ff;
Tcp_Packed.Tcp.DestPort=TcpStatus[num].Dest_Port;
TcpStatus[num].TcpHeadUint8[4]=(TcpStatus[num].SenPassSeq&0xff000000)>>24;
TcpStatus[num].TcpHeadUint8[5]=(TcpStatus[num].SenPassSeq&0x00ff0000)>>16;
TcpStatus[num].TcpHeadUint8[6]=(TcpStatus[num].SenPassSeq&0x0000ff00)>>8;
TcpStatus[num].TcpHeadUint8[7]=(TcpStatus[num].SenPassSeq&0x000000ff);
Tcp_Packed.Tcp.SeqNum=TcpStatus[num].ISS;
TcpStatus[num].TcpHeadUint8[8]=(TcpStatus[num].SenPassAck&0xff000000)>>24;
TcpStatus[num].TcpHeadUint8[9]=(TcpStatus[num].SenPassAck&0x00ff0000)>>16;
TcpStatus[num].TcpHeadUint8[10]=(TcpStatus[num].SenPassAck&0x0000ff00)>>8;
TcpStatus[num].TcpHeadUint8[11]=(TcpStatus[num].SenPassAck&0x000000ff);
Tcp_Packed.Tcp.AckNum=TcpStatus[num].Rcv_Next;
TcpStatus[num].TcpHeadUint8[12]=0x70;
Tcp_Packed.Tcp.offset=0x70;
TcpStatus[num].TcpHeadUint8[13]=0x12;
Tcp_Packed.Tcp.control=0x12; //syn+ack
TcpStatus[num].TcpHeadUint8[14]=(TcpStatus[num].Snd_Window&0xff00)>>8;
TcpStatus[num].TcpHeadUint8[15]=TcpStatus[num].Snd_Window&0x00ff;
Tcp_Packed.Tcp.window=TcpStatus[num].Snd_Window;
TcpStatus[num].TcpHeadUint8[16]=0;
TcpStatus[num].TcpHeadUint8[17]=0;
Tcp_Packed.Tcp.Crc=0;
TcpStatus[num].TcpHeadUint8[18]=0;
TcpStatus[num].TcpHeadUint8[19]=0;
Tcp_Packed.Tcp.urg=0;
//******添加TCP頭選項*************//
TcpStatus[num].TcpHeadUint8[20]=0X02;
Tcp_Packed.Tcp.tcpdata[0]=0X02;
TcpStatus[num].TcpHeadUint8[21]=0X04;
Tcp_Packed.Tcp.tcpdata[1]=0X04;
TcpStatus[num].TcpHeadUint8[22]=MAX_TCP_DATA/256;
Tcp_Packed.Tcp.tcpdata[2]=MAX_TCP_DATA/256;
TcpStatus[num].TcpHeadUint8[23]=MAX_TCP_DATA%256;
Tcp_Packed.Tcp.tcpdata[3]=MAX_TCP_DATA%256;
TcpStatus[num].TcpHeadUint8[24]=0X01;
Tcp_Packed.Tcp.tcpdata[4]=0X01;
TcpStatus[num].TcpHeadUint8[25]=0X01;
Tcp_Packed.Tcp.tcpdata[5]=0X01;
TcpStatus[num].TcpHeadUint8[26]=0X01;
Tcp_Packed.Tcp.tcpdata[6]=0X01;
TcpStatus[num].TcpHeadUint8[27]=0X01;
Tcp_Packed.Tcp.tcpdata[7]=0X01;
//*********添加TCP假頭**********//
TcpStatus[num].TcpDHeadUint8[0]=0;
Tcp_Packed.TcpDHead.rev=0;
TcpStatus[num].TcpDHeadUint8[1]=6;
Tcp_Packed.TcpDHead.NextProtocal=6;
TcpStatus[num].TcpDHeadUint8[2]=0;
TcpStatus[num].TcpDHeadUint8[3]=28;
Tcp_Packed.TcpDHead.TotalLen=28;
TcpStatus[num].TcpDHeadUint8[4]=TcpStatus[num].My_Ip[0];
TcpStatus[num].TcpDHeadUint8[5]=TcpStatus[num].My_Ip[1];
TcpStatus[num].TcpDHeadUint8[6]=TcpStatus[num].My_Ip[2];
TcpStatus[num].TcpDHeadUint8[7]=TcpStatus[num].My_Ip[3];
TcpStatus[num].TcpDHeadUint8[8]=TcpStatus[num].Dest_Ip[0];
TcpStatus[num].TcpDHeadUint8[9]=TcpStatus[num].Dest_Ip[1];
TcpStatus[num].TcpDHeadUint8[10]=TcpStatus[num].Dest_Ip[2];
TcpStatus[num].TcpDHeadUint8[11]=TcpStatus[num].Dest_Ip[3];
//Tcp_Packed.Tcp.Crc=CheckSumTcp((uint16 EX_RAM *)&Tcp_Packed,Tcp_Packed.TcpDHead.TotalLen+12);
Tcp_Packed.Tcp.Crc=CheckSumTcp1(num,40);//12+28
TcpStatus[num].TcpHeadUint8[16]=(Tcp_Packed.Tcp.Crc&0xff00)>>8;;
TcpStatus[num].TcpHeadUint8[17]=Tcp_Packed.Tcp.Crc&0x00ff;
//memcpy (&(TcpStatus[num].resend_data),&(Tcp_Packed.Tcp) , Tcp_Packed.TcpDHead.TotalLen);
TcpStatus[num].ResendLength=Tcp_Packed.TcpDHead.TotalLen;
TxdData.STPTR=NULL;
TxdData.length=Tcp_Packed.TcpDHead.TotalLen;
TxdData.DAPTR=TcpStatus[num].TcpHeadUint8;
Send_Ip_Frame
(
&TxdData,
TcpStatus[num].Dest_Ip,
TcpStatus[num].My_Ip,
6
);
}
else if(Tcp_Packed.Tcp.control&TCP_RST)
{
Delete_Socket(num);
}
else if((Tcp_Packed.Tcp.control&TCP_ACK)==TCP_ACK)
{
TcpStatus[num].RecPassAck=Tcp_Packed.Tcp.AckNum;//確認
TcpStatus[num].RecPassSeq=Tcp_Packed.Tcp.SeqNum;//對方的初始化順序號
TcpStatus[num].SenPassSeq=TcpStatus[num].RecPassAck;
TcpStatus[num].SenPassAck=TcpStatus[num].RecPassSeq;//我的順序號,用于發送
TcpHeadHandle(num ,0x5000+TCP_RST);//headlength 0x20,
TcpStatus[num].TcpDHeadUint8[2]=0;
TcpStatus[num].TcpDHeadUint8[3]=20;
Tcp_Packed.TcpDHead.TotalLen=20;
Tcp_Packed.Tcp.Crc=CheckSumTcp1(num,32);//12+28
TcpStatus[num].TcpHeadUint8[16]=(Tcp_Packed.Tcp.Crc&0xff00)>>8;;
TcpStatus[num].TcpHeadUint8[17]=Tcp_Packed.Tcp.Crc&0x00ff;
TxdData.STPTR=NULL;
TxdData.length=20;
TxdData.DAPTR=TcpStatus[num].TcpHeadUint8;
Send_Ip_Frame
(
&TxdData,
TcpStatus[num].Dest_Ip,
TcpStatus[num].My_Ip,
6
);
}
return 0;
}
/**********************************************************************
**函數原型: void Tcp_Close_Wait( )
**入口參數: 無
**出口參數: 無
**返 回 值: 無
**說 明: TCP等待關閉狀態的處理
************************************************************************/
/*void Tcp_Close_Wait(uint8 num)
{
//TcpStatus[num].Send_Next++;
uint16 i;
i=Tcp_Packed.Tcp.SourcePort;
Tcp_Packed.Tcp.SourcePort=Tcp_Packed.Tcp.DestPort;
Tcp_Packed.Tcp.DestPort=i;
Tcp_Packed.Tcp.SeqNum=TcpStatus[num].Send_Next;
Tcp_Packed.Tcp.AckNum=TcpStatus[num].Rcv_Next;
Tcp_Packed.Tcp.control=TCP_FIN+TCP_ACK;
TcpStatus[num].Sent_UnAck=TcpStatus[num].Send_Next;
TcpStatus[num].State=TCP_STATE_CLOSED;//TCP_STATE_LAST_ACK ;
Send_Reset(num);//復位對方連接
// TcpStatus[num].State=TCP_STATE_LAST_ACK ;
}
*/
/**********************************************************************
**函數原型: void Tcp_Last_Ack( )
**入口參數: 無
**出口參數: 無
**返 回 值: 無
**說 明: 接收到TCP_RST,TCP_SYN或TCP_ACK報文時,關閉連接
************************************************************************/
void Tcp_Last_Ack(uint8 num)
{
if(Tcp_Packed.Tcp.control&(TCP_RST+TCP_SYN+TCP_ACK))
{//對方不接受請求,關閉本地連接
Delete_Socket(num);
}
}
uint8 Tcp_Established(uint8 num)
{//
uint16 i;
uint16 temp;
// uint16 tcplength;
struct _pkst TxdData;
if(Tcp_Packed.Tcp.control&(TCP_RST+TCP_SYN))
{
Delete_Socket(num);
return (0);
}
if(Tcp_Packed.Tcp.control&(TCP_FIN))
{
TcpStatus[num].RecPassSeq=Tcp_Packed.Tcp.SeqNum;
TcpStatus[num].RecPassAck=Tcp_Packed.Tcp.AckNum;
//Tcp_Packed.Tcp.control=TCP_ACK;
TcpStatus[num].SenPassSeq=TcpStatus[num].RecPassAck;
TcpStatus[num].SenPassAck=TcpStatus[num].RecPassSeq+1;
TcpStatus[num].SenFutureSeq=TcpStatus[num].SenPassSeq;
TcpStatus[num].RecFutureAck=TcpStatus[num].SenPassSeq+1;
TcpHeadHandle(num ,0x5000+TCP_ACK);//headlength 0x20,
TcpStatus[num].TcpDHeadUint8[2]=0;
TcpStatus[num].TcpDHeadUint8[3]=20;
Tcp_Packed.TcpDHead.TotalLen=20;
Tcp_Packed.Tcp.Crc=CheckSumTcp1(num,32);//12+28
TcpStatus[num].TcpHeadUint8[16]=(Tcp_Packed.Tcp.Crc&0xff00)>>8;;
TcpStatus[num].TcpHeadUint8[17]=Tcp_Packed.Tcp.Crc&0x00ff;
TxdData.STPTR=NULL;
TxdData.length=20;
TxdData.DAPTR=TcpStatus[num].TcpHeadUint8;
Send_Ip_Frame
(
&TxdData,
TcpStatus[num].Dest_Ip,
TcpStatus[num].My_Ip,
6
);
/***************CLOSING WAIT*****************/
//Tcp_Packed.Tcp.control=TCP_FIN+TCP_ACK;
TcpHeadHandle(num ,0x5000+TCP_FIN+TCP_ACK);//headlength 0x20,
TcpStatus[num].TcpDHeadUint8[2]=0;
TcpStatus[num].TcpDHeadUint8[3]=20;
Tcp_Packed.TcpDHead.TotalLen=20;
Tcp_Packed.Tcp.Crc=CheckSumTcp1(num,32);//12+20
TcpStatus[num].TcpHeadUint8[16]=(Tcp_Packed.Tcp.Crc&0xff00)>>8;;
TcpStatus[num].TcpHeadUint8[17]=Tcp_Packed.Tcp.Crc&0x00ff;
TxdData.STPTR=NULL;
TxdData.length=20;
TxdData.DAPTR=TcpStatus[num].TcpHeadUint8;
Send_Ip_Frame
(
&TxdData,
TcpStatus[num].Dest_Ip,
TcpStatus[num].My_Ip,
6
);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -