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

📄 tcp.c

📁 ADC图形图像例子
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -