📄 tcp.c
字号:
TxdNetBuff.IpFrame.NextProtocal = 6;
TxdNetBuff.IpFrame.Crc = 28;
TxdNetBuff.TcpFrame.Crc = CreateTcpCrc();
Create_Ip_Frame(28, TCP1024.Dest_Ip[0], TCP1024.Dest_Ip[1], 6);
}
}
}
void Tcp_SYN_Rec()
{
if (RxdNetBuff.TcpFrame.control &(TCP_RST | TCP_SYN))
{
Send_Reset();
}
else if (RxdNetBuff.TcpFrame.control &TCP_ACK)
{
if ((TCP1024.Sent_UnAck <= RxdNetBuff.TcpFrame.AckNum) &&
(RxdNetBuff.TcpFrame.AckNum <= TCP1024.Send_Next))
{
TCP1024.Sent_UnAck = RxdNetBuff.TcpFrame.AckNum;
TCP1024.State = TCP_STATE_ESTABLISHED; //tcp_syn_established;
TcpConnected = 1;
}
}
}
void Process_TcpData_Rec(uint length)
{
uint ii;
if (RxdNetBuff.TcpFrame.SeqNum == TCP1024.Rcv_Next)
{
for (ii = 0; ii < length; ii++)
{
UartTxCharCh1(RxdNetBuff.TcpFrame.tcpdata[ii]);
}
TCP1024.Rcv_Next = TCP1024.Rcv_Next + length;
}
}
uchar Check_Free_Resend_Buff()
{
if (Resend_Buff.ResendFrame.RtStatus == 0)
{
return (1);
}
return (0);
}
uint Copy_Send_Data()
{
uint ii;
if (Check_Free_Resend_Buff() == 0)
return (0);
for (ii = 0; ii < 1024; ii++)
{
if (UartIsRxCh1() == TRUE)
{
TxdNetBuff.TcpFrame.tcpdata[ii] = UartRxCharCh1();
}
else
{
break;
};
}
return (ii);
}
void Process_Tcp_Timeout()
{
uint tcplength;
unsigned char i;
Tcp_Timeout = 0;
Process_Resend_Buff();
if ((TCP1024.State == TCP_STATE_ESTABLISHED) || (TCP1024.State ==
TCP_STATE_CLOSE_WAIT))
if (Check_Free_Resend_Buff())
{
if (UartIsRxCh1() == TRUE)
{
for (i = 0; i < 3; i++)
{
TxdNetBuff.EtherFrame.DestMacId[i] = TCP1024.Dest_Mac_Id[i];
}
TxdNetBuff.EtherFrame.NextProtocal = 0x0008;
TxdNetBuff.TcpFrame.SourcePort = TCP1024.My_Port;
TxdNetBuff.TcpFrame.DestPort = TCP1024.Dest_Port;
TxdNetBuff.TcpFrame.SeqNum = TCP1024.Send_Next;
TxdNetBuff.TcpFrame.AckNum = TCP1024.Rcv_Next;
TxdNetBuff.TcpFrame.offset = 0x50;
TxdNetBuff.TcpFrame.control = TCP_ACK + TCP_PSH; //
TxdNetBuff.TcpFrame.window = TCP1024.Snd_Window;
TxdNetBuff.TcpFrame.urg = 0;
TxdNetBuff.TcpFrame.Crc = 0;
TxdNetBuff.IpFrame.DestId[0] = TCP1024.Dest_Ip[0];
TxdNetBuff.IpFrame.DestId[1] = TCP1024.Dest_Ip[1];
TxdNetBuff.IpFrame.SourceIp[0] = My_Ip_Address.words[0];
TxdNetBuff.IpFrame.SourceIp[1] = My_Ip_Address.words[1];
TxdNetBuff.IpFrame.ttl = 0;
TxdNetBuff.IpFrame.NextProtocal = 6;
tcplength = Copy_Send_Data();
TCP1024.Send_Next = TCP1024.Send_Next + tcplength;
tcplength = tcplength + 20; //
TxdNetBuff.IpFrame.Crc = tcplength;
TxdNetBuff.TcpFrame.Crc = CreateTcpCrc();
Create_Ip_Frame(tcplength, TCP1024.Dest_Ip[0], TCP1024.Dest_Ip[1], 6);
}
}
if (TCP1024.State == TCP_STATE_TIME_WAIT)
{
Delete_Socket();
}
if (TCP1024.State == TCP_STATE_CLOSE_WAIT)
{
for (i = 0; i < 3; i++)
{
TxdNetBuff.EtherFrame.DestMacId[i] = TCP1024.Dest_Mac_Id[i];
}
TxdNetBuff.EtherFrame.NextProtocal = 0x0008;
TxdNetBuff.TcpFrame.SourcePort = TCP1024.My_Port;
TxdNetBuff.TcpFrame.DestPort = TCP1024.Dest_Port;
TxdNetBuff.TcpFrame.SeqNum = TCP1024.Send_Next;
TxdNetBuff.TcpFrame.AckNum = TCP1024.Rcv_Next;
TxdNetBuff.TcpFrame.offset = 0x50;
TxdNetBuff.TcpFrame.control = TCP_FIN + TCP_ACK; //
TxdNetBuff.TcpFrame.window = TCP1024.Snd_Window;
TxdNetBuff.TcpFrame.urg = 0;
TxdNetBuff.TcpFrame.Crc = 0;
TxdNetBuff.IpFrame.DestId[0] = TCP1024.Dest_Ip[0];
TxdNetBuff.IpFrame.DestId[1] = TCP1024.Dest_Ip[1];
TxdNetBuff.IpFrame.SourceIp[0] = My_Ip_Address.words[0];
TxdNetBuff.IpFrame.SourceIp[1] = My_Ip_Address.words[1];
TxdNetBuff.IpFrame.ttl = 0;
TxdNetBuff.IpFrame.NextProtocal = 6; //tcp
TCP1024.Send_Next = TCP1024.Send_Next;
tcplength = 20;
TxdNetBuff.IpFrame.Crc = tcplength;
TxdNetBuff.TcpFrame.Crc = CreateTcpCrc();
Create_Ip_Frame(tcplength, TCP1024.Dest_Ip[0], TCP1024.Dest_Ip[1], 6);
TCP1024.State = TCP_STATE_LAST_ACK;
}
}
void Tcp_Last_Ack()
{
if (RxdNetBuff.TcpFrame.control &(TCP_RST + TCP_SYN + TCP_ACK)) {
Delete_Socket();
}
}
void Tcp_Close_Wait()
{
if (RxdNetBuff.TcpFrame.control &(TCP_RST + TCP_SYN))
{
Delete_Socket();
}
else if (RxdNetBuff.TcpFrame.control &TCP_ACK)
{
if ((TCP1024.Sent_UnAck <= RxdNetBuff.TcpFrame.AckNum) &&
(RxdNetBuff.TcpFrame.AckNum <= TCP1024.Send_Next))
{
TCP1024.Sent_UnAck = RxdNetBuff.TcpFrame.AckNum;
Process_Resend_Buff();
}
}
}
void Tcp_Established()
{
uchar i;
uint temp;
uint tcplength;
if (RxdNetBuff.TcpFrame.control &(TCP_RST + TCP_SYN))
{
Delete_Socket();
}
if (RxdNetBuff.TcpFrame.control &(TCP_FIN))
if (RxdNetBuff.TcpFrame.SourcePort == TCP1024.Dest_Port)
//fin
{
TCP1024.State = TCP_STATE_CLOSE_WAIT;
TCP1024.Rcv_Next++;
}
temp = RxdNetBuff.TcpFrame.offset >> 4;
temp = temp * 4+20;
temp = RxdNetBuff.IpFrame.TotalLen - temp;
if (temp > 0)
{
Process_TcpData_Rec(temp);
}
if (RxdNetBuff.TcpFrame.control &TCP_ACK)
{
TcpConnected = 1;
if ((TCP1024.Sent_UnAck <= RxdNetBuff.TcpFrame.AckNum) &&
(RxdNetBuff.TcpFrame.AckNum <= TCP1024.Send_Next))
{
TCP1024.Sent_UnAck = RxdNetBuff.TcpFrame.AckNum;
Process_Resend_Buff();
}
if ((temp > 0) || (TCP1024.State == TCP_STATE_CLOSE_WAIT))
{
for (i = 0; i < 3; i++)
{
TxdNetBuff.EtherFrame.DestMacId[i] = TCP1024.Dest_Mac_Id[i];
}
TxdNetBuff.EtherFrame.NextProtocal = 0x0008;
TxdNetBuff.TcpFrame.SourcePort = TCP1024.My_Port;
TxdNetBuff.TcpFrame.DestPort = TCP1024.Dest_Port;
TxdNetBuff.TcpFrame.SeqNum = TCP1024.Send_Next;
TxdNetBuff.TcpFrame.AckNum = TCP1024.Rcv_Next;
TxdNetBuff.TcpFrame.offset = 0x50;
TxdNetBuff.TcpFrame.control = TCP_ACK; //
TxdNetBuff.TcpFrame.window = TCP1024.Snd_Window;
TxdNetBuff.TcpFrame.urg = 0;
TxdNetBuff.TcpFrame.Crc = 0;
TxdNetBuff.IpFrame.DestId[0] = TCP1024.Dest_Ip[0];
TxdNetBuff.IpFrame.DestId[1] = TCP1024.Dest_Ip[1];
TxdNetBuff.IpFrame.SourceIp[0] = My_Ip_Address.words[0];
TxdNetBuff.IpFrame.SourceIp[1] = My_Ip_Address.words[1];
TxdNetBuff.IpFrame.ttl = 0;
TxdNetBuff.IpFrame.NextProtocal = 6;
tcplength = Copy_Send_Data();
if (tcplength > 0)
TxdNetBuff.TcpFrame.control = TCP_ACK + TCP_PSH;
TCP1024.Send_Next = TCP1024.Send_Next + tcplength;
tcplength = tcplength + 20;
TxdNetBuff.IpFrame.Crc = tcplength;
TxdNetBuff.TcpFrame.Crc = CreateTcpCrc();
Create_Ip_Frame(tcplength, TCP1024.Dest_Ip[0], TCP1024.Dest_Ip[1], 6);
}
}
}
void Process_Tcp()
{
volatile U16 port, length;
Tcp_Timeout = 0;
if (RxdNetBuff.IpFrame.DestId[0] == My_Ip_Address.words[0])
if (RxdNetBuff.IpFrame.DestId[1] == My_Ip_Address.words[1])
if (VerifyTcpCrc())
{
port = converU16(RxdNetBuff.TcpFrame.DestPort);
if (port == MY_TCP_PORT)
{
length = converU16(RxdNetBuff.IpFrame.TotalLen);
length += 14;
UartPrintfCh1("Rec a tcp packet: \r\n");
PrintDataAsAsc((U8*) &RxdNetBuff + 4, length);
// switch (TCP1024.State)
// {
// case 0: Tcp_Listen();
// break;
// case 1: Tcp_SYN_Rec();
// break;
// case 2: Tcp_SYN_Sent();
// break;
// case 3: Tcp_Established();
// break;
//
// case 7: Tcp_Close_Wait();
// break;
// case 8: Tcp_Last_Ack();
// break;
//
// }
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -