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

📄 tcp.c

📁 ADC图形图像例子
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************
 * File: TCP.c
 * 
 * Copyright: Peak Microtech Corporation
 *
 *******************************************************************/

#define TCP_GLOBALS
#include "net_cfg.h"

#if 0		// Don't support TCP
// Initialize TCP model
void TCP1024_Init()
{
	TCP1024.State = 0;
	TCP1024.My_Port = MY_TCP_PORT;
	TCP1024.Send_Next = 0x0000;
	Resend_Buff.EtherFrame.RecStatus = 0; // No data in re-RX buffer

}


// Send TCP_RST data packet and reset connect
void Send_Reset()
{
	uchar i;
	for (i = 0; i < 3; i++)
	{
		// Destination MAC address
		TxdNetBuff.EtherFrame.DestMacId[i] = RxdNetBuff.EtherFrame.SourceMacId[i];	
	}
	TxdNetBuff.EtherFrame.NextProtocal = 0x0008; // IP protocol ID
	TxdNetBuff.TcpFrame.SourcePort = RxdNetBuff.TcpFrame.DestPort;
	TxdNetBuff.TcpFrame.DestPort = RxdNetBuff.TcpFrame.SourcePort;
	TxdNetBuff.TcpFrame.offset = 0x50;
	TxdNetBuff.TcpFrame.window = 0;
	TxdNetBuff.TcpFrame.urg = 0;
	TxdNetBuff.TcpFrame.Crc = 0;
	TxdNetBuff.IpFrame.DestId[0] = RxdNetBuff.IpFrame.SourceIp[0];
	TxdNetBuff.IpFrame.DestId[1] = RxdNetBuff.IpFrame.SourceIp[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
	TxdNetBuff.IpFrame.Crc = 20;
	TxdNetBuff.TcpFrame.Crc = CreateTcpCrc();
	Create_Ip_Frame(20, RxdNetBuff.IpFrame.SourceIp[0],
	RxdNetBuff.IpFrame.SourceIp[1], 6);
}


void Tcp_Listen()
{
	uchar i;

	if (RxdNetBuff.TcpFrame.control &TCP_SYN)
	// Request connect
	{
		for (i = 0; i < 2; i++)		
		{
			TCP1024.Dest_Ip[i] = RxdNetBuff.IpFrame.SourceIp[i];
		}
		for (i = 0; i < 3; i++)		
		{
			TCP1024.Dest_Mac_Id[i] = RxdNetBuff.EtherFrame.SourceMacId[i];
		}
		TCP1024.My_Port = MY_TCP_PORT; // My pc port
		TCP1024.Dest_Port = RxdNetBuff.TcpFrame.SourcePort; 
		TCP1024.IRS = RxdNetBuff.TcpFrame.SeqNum; 
		TCP1024.Rcv_Next = RxdNetBuff.TcpFrame.SeqNum + 1; 
		TCP1024.ISS = TCP1024.Send_Next; 
		TCP1024.Sent_UnAck = TCP1024.ISS; 
		TCP1024.Send_Next = TCP1024.ISS + 1;
		TCP1024.My_Wl1 = RxdNetBuff.TcpFrame.SeqNum; //seq
		TCP1024.My_Wl2 = TCP1024.Send_Next; 
		TCP1024.Rcv_Window = RxdNetBuff.TcpFrame.window; 
		TCP1024.Snd_Window = 1024; 
		TCP1024.Dest_Max_Seg_Size = 560; // default:560
		if (RxdNetBuff.TcpFrame.offset > 20)
			if (RxdNetBuff.TcpFrame.tcpdata[0] == 0x02)
				if (RxdNetBuff.TcpFrame.tcpdata[1] == 0x04)
		//0204: The MAX segment
		{
			TCP1024.Dest_Max_Seg_Size = RxdNetBuff.TcpFrame.tcpdata[2] *256
				+RxdNetBuff.TcpFrame.tcpdata[3];
		}
		TCP1024.My_Max_Seg_Size = 1460; 
		
		// Create reply frame
		for (i = 0; i < 3; i++)
		{
			TxdNetBuff.EtherFrame.DestMacId[i] = TCP1024.Dest_Mac_Id[i];
		}
		TxdNetBuff.EtherFrame.NextProtocal = 0x0008; // IP protocol ID
		TxdNetBuff.TcpFrame.SourcePort = TCP1024.My_Port;
		TxdNetBuff.TcpFrame.DestPort = TCP1024.Dest_Port;
		TxdNetBuff.TcpFrame.SeqNum = TCP1024.ISS;
		TxdNetBuff.TcpFrame.AckNum = TCP1024.Rcv_Next;

		TxdNetBuff.TcpFrame.offset = 0x70;
		TxdNetBuff.TcpFrame.control = 0x12; //syn+ack
		TxdNetBuff.TcpFrame.window = TCP1024.Snd_Window;
		TxdNetBuff.TcpFrame.urg = 0;
		TxdNetBuff.TcpFrame.Crc = 0;
		TxdNetBuff.IpPacket.IpPacket[20] = 0x0204; //tcp
		TxdNetBuff.IpPacket.IpPacket[21] = TCP1024.My_Max_Seg_Size;
		TxdNetBuff.IpPacket.IpPacket[22] = 0x0101;
		TxdNetBuff.IpPacket.IpPacket[23] = 0x0101;
		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
		TxdNetBuff.IpFrame.Crc = 28;
		TxdNetBuff.TcpFrame.Crc = CreateTcpCrc();
		Create_Ip_Frame(28, TCP1024.Dest_Ip[0], TCP1024.Dest_Ip[1], 6);
		TCP1024.State = TCP_STATE_SYN_RCVD; //Tcp_SYN_Rec;
	}
	else if (RxdNetBuff.TcpFrame.control &TCP_RST)
	{
		;
	}
	else
	{
		Send_Reset();
	}
}


// Delete connect and clear re-RX buffer
void Delete_Socket()
{
	TcpConnected = 0;
	TCP1024.State = 0;
	TCP1024.ISS = TCP1024.ISS + 10; 
	Resend_Buff.EtherFrame.RecStatus = 0; // No data in re-RX buffer
	UartPrintfCh1("Disconnect!\r\n");
}


// Resend the error packet
void Resend_Packet()
{
	uint ii;
	uchar *txd = (U8*) &TxdNetBuff;
	uchar *rt;

	rt = (U8*) &Resend_Buff.bytes.bytebuf;
	for (ii = 0; ii < Resend_Buff.ResendFrame.length + 4; ii++)	
	{
		(*txd) = (*rt);
		rt++;
		txd++;
	}
	Send_Packet(&TxdNetBuff, Resend_Buff.ResendFrame.length);
	Resend_Buff.ResendFrame.timeout = RtTime;
}


void Process_Resend_Buff()
{

	if (Resend_Buff.ResendFrame.timeout > 0)
		Resend_Buff.ResendFrame.timeout--;	
	if (Resend_Buff.EtherFrame.RecStatus != 0)	
	{
		if (Resend_Buff.TcpFrame.SeqNum < TCP1024.Sent_UnAck)	
		{
			Resend_Buff.ResendFrame.RtStatus = 0;
		} 
		else if (Resend_Buff.ResendFrame.timeout == 0)		
		{			
			Resend_Buff.ResendFrame.RtStatus++; 
			if (Resend_Buff.ResendFrame.RtStatus == TCP_MAX_RETXD)
			{				
				Delete_Socket();
			}
			else			
				Resend_Packet();
		}
	}
}


void Tcp_SYN_Sent()
{
	unsigned char i;

	if (((RxdNetBuff.TcpFrame.AckNum <= TCP1024.ISS) ||
	(RxdNetBuff.TcpFrame.AckNum > TCP1024.Send_Next)) &&
	(RxdNetBuff.TcpFrame.control &TCP_ACK))
	{		
		if (!(RxdNetBuff.TcpFrame.control &TCP_RST))
		{			
			TxdNetBuff.TcpFrame.SeqNum = RxdNetBuff.TcpFrame.AckNum;
			TxdNetBuff.TcpFrame.AckNum = 0;
			TxdNetBuff.TcpFrame.control = TCP_RST;
			Send_Reset(); 
		}
		else		
		{
			Delete_Socket();
		}
	}
	else if (RxdNetBuff.TcpFrame.control &(TCP_SYN))
	{
		TCP1024.IRS = RxdNetBuff.TcpFrame.SeqNum; 
		TCP1024.Rcv_Next = RxdNetBuff.TcpFrame.SeqNum + 1;	
		if (RxdNetBuff.TcpFrame.control &TCP_ACK)
		{
			TCP1024.Sent_UnAck = RxdNetBuff.TcpFrame.AckNum; 
			Process_Resend_Buff();
		}
		if (TCP1024.Sent_UnAck >= TCP1024.ISS)
		{			
			TCP1024.IRS = RxdNetBuff.TcpFrame.SeqNum;
			TCP1024.Rcv_Window = RxdNetBuff.TcpFrame.window;	
			TCP1024.Dest_Max_Seg_Size = 560; // default:560
			if (RxdNetBuff.TcpFrame.offset > 20)
				if (RxdNetBuff.TcpFrame.tcpdata[0] == 0x02)
					if (RxdNetBuff.TcpFrame.tcpdata[1] == 0x04)
			//0204: The MAX segment
			{
				TCP1024.Dest_Max_Seg_Size = RxdNetBuff.TcpFrame.tcpdata[2] *256
					+RxdNetBuff.TcpFrame.tcpdata[3];
			}
			
			// Create reply frame
			for (i = 0; i < 3; i++)			
			{
				TxdNetBuff.EtherFrame.DestMacId[i] = TCP1024.Dest_Mac_Id[i];
			}
			TxdNetBuff.EtherFrame.NextProtocal = 0x0008; // IP protocol ID
			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; //tcp
			TxdNetBuff.IpFrame.Crc = 20;
			TxdNetBuff.TcpFrame.Crc = CreateTcpCrc();
			Create_Ip_Frame(20, TCP1024.Dest_Ip[0], TCP1024.Dest_Ip[1], 6);
			TCP1024.State = TCP_STATE_ESTABLISHED;
			TcpConnected = 1;
			UartPrintfCh1("\r\nOK,connected.\r\nC:>");
		}
		else
		{			
			TCP1024.State = TCP_STATE_SYN_RCVD;			
			for (i = 0; i < 3; i++)			
			{
				TxdNetBuff.EtherFrame.DestMacId[i] = TCP1024.Dest_Mac_Id[i];
			}
			TxdNetBuff.EtherFrame.NextProtocal = 0x0008; //IP protocol ID
			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 = 0x70;
			TxdNetBuff.TcpFrame.control = TCP_ACK + TCP_SYN; //TCP_ACK+TCP_SYN
			TxdNetBuff.TcpFrame.window = TCP1024.Snd_Window;
			TxdNetBuff.TcpFrame.urg = 0;
			TxdNetBuff.TcpFrame.Crc = 0;
			TxdNetBuff.IpPacket.IpPacket[20] = 0x0204; //
			TxdNetBuff.IpPacket.IpPacket[21] = TCP1024.My_Max_Seg_Size;
			TxdNetBuff.IpPacket.IpPacket[22] = 0x0101;
			TxdNetBuff.IpPacket.IpPacket[23] = 0x0101;
			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;

⌨️ 快捷键说明

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