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

📄 tcp.c

📁 RTL8019以太网开发板资料
💻 C
📖 第 1 页 / 共 3 页
字号:
					StrConnection_buf[nr].ucBakSERIESNUM = StrConnection_buf[nr].ucSERIESNUM;	   //建立连接后,保存系列号
					StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE; 
					StrConnection_buf[nr].state = STATE_ESTABLISHED;		//代表一个打开的连接,数据可以传送给用户
					LinkFlag = TCP;
					break;
				case FLG_RST | FLG_SYN: 				 //收到重置同步位
					StrConnection_buf[nr].ucTRUECODE += 1;	   //确认号等于序列号
					StrConnection_buf[nr].ucSERIESNUM = strTcp.ucTRUECODE;   //序列号等确认号
					tcp_ReBack(FLG_RST | FLG_ACK, 20, nr);					//回复确认后,
					StrConnection_buf[nr].state = STATE_SYN_RECEIVED;		//等待收到确认位
					break;
				case FLG_ACK:		//发送数据后,等待请求回复
					StrConnection_buf[nr].ucBakSERIESNUM = StrConnection_buf[nr].ucSERIESNUM;	   //建立连接后,保存系列号
					StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE;
					StrConnection_buf[nr].state = STATE_ESTABLISHED;		//代表一个打开的连接,数据可以传送给用户
					LinkFlag = TCP;
				default:
					break;
			}
			break;
		case STATE_ESTABLISHED: 			   //代表一个打开的连接,数据可以传送给用户
			switch(TcpFlag)
			{
				case FLG_ACK:			//收到确认位 
					if(StrConnection_buf[nr].HttpFlag == TCP_HTTP)	   //发果是发送了HTTP数据后,发送一个停止位
					{
						tcp_ReBack(FLG_FIN | FLG_ACK, 20, nr);		  //发出确认后,同进也发出自己的自已的断开的确信号
						StrConnection_buf[nr].state = STATE_CLOSE_WAIT;	  //在连接的状态下停止
						StrConnection_buf[nr].HttpFlag = TCP_END;
					}
					break;
				case FLG_RST:			//传输过程中失败后有重置位产生
					StrConnection_buf[nr].ucTRUECODE += 1;	   //序列号加1
					tcp_ReBack(FLG_SYN | FLG_RST, 20, nr);					//发送一个重置和同步位
					StrConnection_buf[nr].state = STATE_SYN_RECEIVED;			//在收到和发送一个连接请求后等待对连接请求的确认
					break;
				case FLG_ACK | FLG_PSH: 		//收到数据
					if(StrConnection_buf[nr].ucBakSERIESNUM == strTcp.ucTRUECODE) 		 //收到确认号与序列号都相等才表示成功
					{
						if(FALSE == gbHaveFragment)                                           // 没有分片的数据 
				        {
				            pucTCPData = &gstaRevEthernet.ucaPacket[header_len + 20];		  //表示TCP的包头长度
				        }
				        else
				        {
				            pucTCPData = &gucaSegTemp[header_len + 20];                     //表示TCP的包头长度 
				        }
						if(StrConnection_buf[nr].ucBakTRUECODE == strTcp.ucSERIESNUM) 	 //如果确认号是新的确认号
						{
							StrConnection_buf[nr].ucTRUECODE = strTcp.ucSERIESNUM + data_len;		  //回复的确认号要加上数据长度
							StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE; 
							SerialSendbuf(pucTCPData,data_len);		   //发送给串口
							tcp_ReBack(FLG_ACK, 20, nr);		  //回复确认收到数据
						}
						else 
						{
							StrConnection_buf[nr].ucTRUECODE = StrConnection_buf[nr].ucBakTRUECODE; 
							tcp_ReBack(FLG_ACK, 20, nr);		  //回复确认收到数据
						}
					}
					break;
				case FLG_ACK | FLG_FIN: 		   //收到结束位
					StrConnection_buf[nr].ucTRUECODE += 1;	   //确认号等于序列号
					tcp_ReBack(FLG_ACK, 20, nr);		 //回复结束的确认位
					tcp_ReBack(FLG_FIN | FLG_ACK, 20, nr);		  //发出确认后,同进也发出自己的自已的断开的确信号
					StrConnection_buf[nr].state = STATE_CLOSE_WAIT;	  //等待从本地用户发来的连接中断请求
		  			break;
				case FLG_ACK | FLG_RST: 			 //收到确信重置位
					StrConnection_buf[nr].ucTRUECODE += 1;	   //确认号等于序列号
					tcp_ReBack(FLG_SYN |FLG_RST, 20, nr);		 //回复结束的确认位
					StrConnection_buf[nr].state = STATE_LAST_ACK;	  //等待从本地用户发来的连接中断请求
		  			break;
				case FLG_ACK | FLG_FIN | FLG_PSH: 		   //收到结束位
					if(StrConnection_buf[nr].ucBakSERIESNUM == strTcp.ucTRUECODE) 		 //收到确认号与序列号都相等才表示成功
					{
						if(FALSE == gbHaveFragment)                                           // 没有分片的数据 
				        {
				            pucTCPData = &gstaRevEthernet.ucaPacket[header_len + 20];		  //表示TCP的包头长度
				        }
				        else
				        {
				            pucTCPData = &gucaSegTemp[header_len + 20];                     //表示TCP的包头长度 
				        }
						if(StrConnection_buf[nr].ucBakTRUECODE == strTcp.ucSERIESNUM) 	 //如果确认号是新的确认号
						{
							StrConnection_buf[nr].ucTRUECODE = strTcp.ucSERIESNUM + data_len;		  //回复的确认号要加上数据长度
							StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE; 
//		       				if(SourcePort == NetParameter.Port_Local)		  //如果是本地端口号,数据就从串口发出
//							{
								SerialSendbuf(pucTCPData,data_len);		   //发送给串口
								tcp_ReBack(FLG_ACK, 20, nr);		  //回复确认收到数据
//							}
//							else if(SourcePort == 80)		//表示HTTP的端口号,发送网页
//							{
//								http_server(nr, 0);
//							}
						}
						else 
						{
							StrConnection_buf[nr].ucTRUECODE = StrConnection_buf[nr].ucBakTRUECODE; 
							tcp_ReBack(FLG_ACK, 20, nr);		  //回复确认收到数据
						}
					}
					else 
					{
						StrConnection_buf[nr].ucTRUECODE += 1;	   //确认号等于序列号
						tcp_ReBack(FLG_ACK, 20, nr);		 //回复结束的确认位
					}
					tcp_ReBack(FLG_FIN | FLG_ACK, 20, nr);		  //发出确认后,同进也发出自己的自已的断开的确信号
					StrConnection_buf[nr].state = STATE_LAST_ACK;	  //等待从本地用户发来的连接中断请求
		  			break;
				default:
					break;
			}
			break;
		case STATE_CLOSE_WAIT:			//等待从本地用户发来的连接中断请求
			switch(TcpFlag)
			{
				case FLG_ACK | FLG_FIN: 	 //收到结束位
					StrConnection_buf[nr].ucTRUECODE += 1;	   //确认号等于序列号
					tcp_ReBack(FLG_ACK, 20, nr);		 //回复结束的确认位
					break;
				default:
					break;
			}
			StrConnection_buf[nr].state = STATE_CLOSED;	  //表示没有连接
			StrConnection_buf[nr].ipaddr = 0;	  //IP地址为0
			LinkFlag = UDP;

			break;
		case STATE_LAST_ACK:
			StrConnection_buf[nr].state = STATE_CLOSED;	  //表示没有连接
			StrConnection_buf[nr].ipaddr = 0;	  //IP地址为0
			LinkFlag = UDP;
			break;
		case STATE_FIN_WAIT_1:				 // He may still be sending me data - should process it
			StrConnection_buf[nr].ucTRUECODE += data_len;
			switch(TcpFlag)
			{
				case FLG_ACK:			//收到确认信号后。
					StrConnection_buf[nr].state = STATE_CLOSED;	  //表示没有连接
					StrConnection_buf[nr].ipaddr = 0;	  //IP地址为0
					LinkFlag = UDP;
					break; 
				case FLG_FIN:
         			StrConnection_buf[nr].ucTRUECODE++;
					tcp_ReBack(FLG_ACK | FLG_FIN, 20, nr);	
					StrConnection_buf[nr].state = STATE_CLOSE_WAIT;  	//等待对方的回复
					break;
				case FLG_ACK | FLG_FIN:
         			StrConnection_buf[nr].ucTRUECODE++;
					tcp_ReBack(FLG_ACK, 20, nr);			  //回复确认信号
					StrConnection_buf[nr].state = STATE_CLOSED;	  //表示没有连接
					StrConnection_buf[nr].ipaddr = 0;	  //IP地址为0
					LinkFlag = UDP;
					break;
				default:			  //如果不是中断信号
         			StrConnection_buf[nr].ucTRUECODE++;
					tcp_ReBack(FLG_ACK, 20, nr);			  //回复确认信号
					StrConnection_buf[nr].state = STATE_FIN_WAIT_2;
					break;
			}
			break;
		case STATE_FIN_WAIT_2: 		  // He may still be sending me data - should process it
			switch(TcpFlag)
			{
				case FLG_RST:			//传输过程中失败后有重置位产生
					StrConnection_buf[nr].ucTRUECODE += 1;	   //序列号加1
					tcp_ReBack(FLG_SYN | FLG_RST, 20, nr);					//发送一个重置和同步位
					StrConnection_buf[nr].state = STATE_SYN_RECEIVED;			//在收到和发送一个连接请求后等待对连接请求的确认
					break;
				case FLG_ACK | FLG_PSH: 		//收到数据
					if(StrConnection_buf[nr].ucBakSERIESNUM == strTcp.ucTRUECODE) 		 //收到确认号与序列号都相等才表示成功
					{
						if(FALSE == gbHaveFragment)                                           // 没有分片的数据 
				        {
				            pucTCPData = &gstaRevEthernet.ucaPacket[header_len + 20];		  //表示TCP的包头长度
				        }
				        else
				        {
				            pucTCPData = &gucaSegTemp[header_len + 20];                     //表示TCP的包头长度 
				        }
						if(StrConnection_buf[nr].ucBakTRUECODE == strTcp.ucSERIESNUM) 	 //如果确认号是新的确认号
						{
							StrConnection_buf[nr].ucTRUECODE = strTcp.ucSERIESNUM + data_len;		  //回复的确认号要加上数据长度
							StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE; 
							SerialSendbuf(pucTCPData,data_len);		   //发送给串口
							tcp_ReBack(FLG_ACK, 20, nr);		  //回复确认收到数据
						}
						else 
						{
							StrConnection_buf[nr].ucTRUECODE = StrConnection_buf[nr].ucBakTRUECODE; 
							tcp_ReBack(FLG_ACK, 20, nr);		  //回复确认收到数据
						}
					}
					StrConnection_buf[nr].state = STATE_ESTABLISHED;		//代表一个打开的连接,数据可以传送给用户
					LinkFlag = TCP;
					break;
				case FLG_ACK | FLG_FIN | FLG_PSH: 		   //收到结束位
					if(StrConnection_buf[nr].ucBakSERIESNUM == strTcp.ucTRUECODE) 		 //收到确认号与序列号都相等才表示成功
					{
						if(FALSE == gbHaveFragment)                                           // 没有分片的数据 
				        {
				            pucTCPData = &gstaRevEthernet.ucaPacket[header_len + 20];		  //表示TCP的包头长度
				        }
				        else
				        {
				            pucTCPData = &gucaSegTemp[header_len + 20];                     //表示TCP的包头长度 
				        }
						if(StrConnection_buf[nr].ucBakTRUECODE == strTcp.ucSERIESNUM) 	 //如果确认号是新的确认号
						{
							StrConnection_buf[nr].ucTRUECODE = strTcp.ucSERIESNUM + data_len;		  //回复的确认号要加上数据长度
							StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE; 
//		       				if(SourcePort == NetParameter.Port_Local)		  //如果是本地端口号,数据就从串口发出
//							{
								SerialSendbuf(pucTCPData,data_len);		   //发送给串口
								tcp_ReBack(FLG_ACK, 20, nr);		  //回复确认收到数据
//							}
//							else if(SourcePort == 80)		//表示HTTP的端口号,发送网页
//							{
//								http_server(nr, 0);
//							}
						}
						else 
						{
							StrConnection_buf[nr].ucTRUECODE = StrConnection_buf[nr].ucBakTRUECODE; 
							tcp_ReBack(FLG_ACK, 20, nr);		  //回复确认收到数据
						}
					}
					else 
					{
						StrConnection_buf[nr].ucTRUECODE += 1;	   //确认号等于序列号
						tcp_ReBack(FLG_ACK, 20, nr);		 //回复结束的确认位
					}
					tcp_ReBack(FLG_FIN | FLG_ACK, 20, nr);		  //发出确认后,同进也发出自己的自已的断开的确信号
					StrConnection_buf[nr].state = STATE_LAST_ACK;	  //等待从本地用户发来的连接中断请求
		  			break;
				case FLG_FIN:
         			StrConnection_buf[nr].ucTRUECODE++;
					tcp_ReBack(FLG_ACK | FLG_FIN, 20, nr);	
					StrConnection_buf[nr].state = STATE_CLOSE_WAIT;  	//等待对方的回复
					break;
				case FLG_ACK | FLG_FIN:
         			StrConnection_buf[nr].ucTRUECODE++;
					tcp_ReBack(FLG_ACK, 20, nr);			  //回复确认信号
					StrConnection_buf[nr].state = STATE_CLOSED;	  //表示没有连接
					StrConnection_buf[nr].ipaddr = 0;	  //IP地址为0
					LinkFlag = UDP;
					break;
				default:
					break;
			}
			break;		
      }
}

⌨️ 快捷键说明

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