亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcp.c

?? 51單片機加rt8019硬件平臺,上web方案及詳細代碼
?? C
字號:
//-----------------------------------tcp.c-----------------------------
//#define DEBUG         

#include<string.h>
#include"includes.h"


typedef enum {
	CLOSED       = 0,	// 沒有連接	
	LISTEN       = 1,	// 收到被動打開;等待SYN
	SYN_SENT     = 2,	// 已經發送SYN;等待ACK
	SYN_RCVD     = 3,	// 已發送SYN+ACK;等待ACK
	ESTABLISHED  = 4,	// 連接已建立;數據傳輸在進行
	FIN_WAIT1    = 5,	// 第一個FIN已經發送;等ACK
	FIN_WAIT2    = 6,	// 第一個FIN的ACK已收到;等第二個FIN

	CLOSE_WAIT   = 7,	// 收到第一個FIN,已發送ACK;等待應用程序關閉
	TIME_WAIT    = 8,	// 收到第二個FIN,已發送ACK;等待2MSL超時
	LAST_ACK     = 9,	// 已發送第二個FIN;等待ACK
	CLOSING	    = 10	// 雙方都已決定同時關閉
} TCPState;



ulong idata isn;
uint xdata sender_tcpport,MinePort;
static ulong xdata sender_ipaddr;
TCB xdata conn[NO_CONN];

//Options: MSS (4 bytes), NOPS (2 bytes), Selective ACK (2 bytes) 
uchar code opt[10] = {
0x02, 0x04, 0x05, 0xB4,
0x01, 0x01,
0x04, 0x02};

/*****************************************
初始化TCP
******************************************/
void init_tcp(void)
{
   memset(conn, 0, sizeof(conn)); 
   isn = 1;
}

/*****************************************
TCP發送
******************************************/
void tcp_send(uint flags, uint hdr_len, uchar cn_id)
{
	ulong idata sum, dest;
	uint idata result;

	Tcp_Header xdata * tcp;
	Ip_Header xdata * ip;
	   
	tcp = (Tcp_Header xdata *)(outbuf + 34); //14以太網頭 + 20IP頭
	ip = (Ip_Header xdata *)(outbuf + 14); 

	if (cn_id == NO_CONN)
	{
		tcp->source_port = MinePort;
		tcp->dest_port = sender_tcpport;
		tcp->sn = 0;
		tcp->ack_sn = 0;
		dest = sender_ipaddr;
	}
	else if (cn_id < 5)
	{
		tcp->source_port = MinePort;
		tcp->dest_port = conn[cn_id].port;
		tcp->sn = conn[cn_id].my_sn;
		tcp->ack_sn = conn[cn_id].his_sn;
		dest = conn[cn_id].ipaddr;
	}
	else
	{
		return;	  //連接數超限
	}   
	tcp->flags = (hdr_len << 10) | flags;
	tcp->window = 1024;
	tcp->checksum = 0;
	tcp->urgent_ptr = 0;
   
   // Sending SYN with header options
	if (hdr_len == 28)
	{
		memcpy(&tcp->options, opt, 8);
	}  
   
	ip->dest_ipaddr = dest;
	ip->source_ipaddr = myipaddr;		
	//偽首部源地址和目標地址 
	sum = (ulong)cksum(outbuf + 26, 8 + hdr_len);
				
	//偽首部協議,首部長度
	sum += (ulong)0x0006;
	sum += (ulong)hdr_len;

	//進位
	result = (uint)(sum + (sum >> 16));
	tcp->checksum = ~result;
	
	ip_send(outbuf, dest, TCP_TYPE, hdr_len);
	
   //(Re)start TCP retransmit timer
	conn[cn_id].timer = TCP_TIMEOUT;
}

/*****************************************
tcp重傳
******************************************/
void tcp_resend(void)
{
	static uchar idata retries = 0;
	uchar idata cn_id;

   //掃描活動連接 
	for (cn_id = 0; cn_id < 5; cn_id++)
	{
		if ((conn[cn_id].ipaddr != 0) && (conn[cn_id].timer))
		{	         
			conn[cn_id].timer--;
			if (conn[cn_id].timer == 0)
			{
				if (conn[cn_id].state != ESTABLISHED)
				{
					tcp_send(FLG_RST, 20, cn_id);
					conn[cn_id].ipaddr = 0;
					return;
				}
				else
				{ 
					if (conn[cn_id].his_ack > conn[cn_id].my_sn)
					{
						tcp_send(FLG_RST, 20, cn_id);
						conn[cn_id].ipaddr = 0;
						return;
					}
					if (conn[cn_id].his_ack < conn[cn_id].my_sn)
					{
						retries++;
						if (retries <= 2)
						{
							http_server(conn[cn_id].query, 0, cn_id, 1);
							conn[cn_id].inactivity = INACTIVITY_TIME;
						}
						else
						{
							tcp_send(FLG_RST, 20, cn_id);
							conn[cn_id].ipaddr = 0;
						}
					}
				}
			}
		}
	}
}

/*****************************************
關閉不活動的連接
******************************************/
void tcp_inactivity(void)
{
	uchar idata cn_id;	   

	for (cn_id = 0; cn_id < 5; cn_id++)
	{
		if ((conn[cn_id].ipaddr != 0) && 
          (conn[cn_id].state == ESTABLISHED) &&
          (conn[cn_id].inactivity))
		{	
			conn[cn_id].inactivity--;
			if (conn[cn_id].inactivity == 0)
			{
				tcp_send((FLG_ACK | FLG_FIN), 20, cn_id);
				conn[cn_id].my_sn++;   
				conn[cn_id].state = FIN_WAIT1;
				TRACE("CONNECT CLOSED",&cn_id,1,0);	
			}
		}
	}
}
/*****************************************
查找連接
若連接已經建立返回連接1
連接沒建立返回空記錄0
連接已滿NO_CONN
******************************************/
uchar conn_search(ulong IPSrc,uint PortSrc,uchar * cn_id)
{
   uchar i;
   for (i=0; i < NO_CONN; i++)
	{
		if( (IPSrc == conn[i].ipaddr) && (PortSrc == conn[i].port) )
		{  
         *cn_id = i; 
         return (1);
		}       
	}
   /*連接沒建立查找空記錄*/
   for (i=0; i < NO_CONN; i++)
	{
		if( conn[i].ipaddr == 0 )
		{ 
         *cn_id = i;  
         return (0);
		}       
	}
   /*連接已滿*/
   return NO_CONN;
}

void tcp_receive(uchar xdata * inbuf, uint len)
{
   uchar cn_id,res;
   ulong idata sum=0L;
   uint idata result, head_len, data_len;
   Ip_Header xdata * ip;
   Tcp_Header xdata * tcp;

   ip  = (Ip_Header xdata *)(inbuf + 14);
   tcp = (Tcp_Header xdata *)(inbuf + 34);

   //加上偽首部計算校驗和		
	sum  = (ulong)cksum(inbuf + 26, 8 + len);//偽首部源地址和目標地址	
	sum += (ulong)0x0006;                    //偽首部協議,TCP總長度
	sum += (ulong)len;                       //TCP總長度	
	result = (uint)(sum + (sum >> 16));      //進位處理 		
	if (result != 0xFFFF)                    //比較
	   return;
      
   //請求的端口不被接受
	if (tcp->dest_port != HTTP_PORT && tcp->dest_port != CUSTOM_PORT)	
	{
		tcp_send(FLG_RST, 20, NO_CONN);//修改該函數添加源端口和目的端口		
		TRACE("tcp->dest_port Err",NULL,0,0);
		return;
	}
   MinePort =  tcp->dest_port;

   res = conn_search(ip->source_ipaddr,tcp->source_port,&cn_id);
   if(res == NO_CONN)
      return;

   if( (res == 0) && (tcp->flags & FLG_SYN) )//建立連接
   {
      conn[cn_id].state = LISTEN;
      TRACE("NEW CONN ID = ",&cn_id,1,0);
   }

   if (tcp->sn > 0xFFFFFF00L) //序號太大
	{ 
		TRACE("EXCEED SN",NULL,0,0);
		conn[cn_id].ipaddr = 0;	
      conn[cn_id].state  =	CLOSED;	
		tcp_send(FLG_RST, 20, NO_CONN);
		return;		
	} 
   
   if (tcp->flags & FLG_RST)//收到RST報文
	{		 
		conn[cn_id].ipaddr = 0;
      conn[cn_id].state  =	CLOSED;
      TRACE("R: FLG_RST STATE = CLOSED",NULL,0,0); 
		return;
	}	
	else if (tcp->flags & FLG_SYN)
	{
      TRACE("R: FLG_SYN",NULL,0,0); 	
      //服務器被動打開初始態為LISTEN,收到SYN會轉換到RCVD   
		if ( (conn[cn_id].state != LISTEN) && (conn[cn_id].state != CLOSED) ) //非法SYN
		{
			conn[cn_id].ipaddr = 0;
            conn[cn_id].state  =	CLOSED;			
		  	tcp_send(FLG_RST, 20, NO_CONN);
			TRACE("INVALID SYN STATE = CLOSED",NULL,0,0);
		  	return;		
		}
	}	
	else if ((tcp->flags & FLG_ACK) == 0) //除RST、SYN報文外都要設置ACK位
	{
		return;	 
	}
   //首部長度包括選項=高4位 X 4 
	head_len = (tcp->flags & 0xF000) >> 10;
	data_len = len - head_len;	
   
	switch (conn[cn_id].state)
	{
	   case CLOSED:
		case LISTEN:     
			if ((tcp->flags & FLG_SYN) && ((tcp->flags & FLG_ACK) == 0)) //收到SYN報文段
			{
				TRACE("R: SYN @LISTEN HIS_SN = ",CP &tcp->sn,4,0); 
				conn[cn_id].ipaddr  = ip->source_ipaddr;
				conn[cn_id].port    = tcp->source_port;
				conn[cn_id].state   = LISTEN;
				conn[cn_id].his_sn  = tcp->sn + 1;	   //將接收到的序號加1用作ack
				conn[cn_id].his_ack = tcp->ack_sn;          

				conn[cn_id].my_sn = isn;
				isn += 64000L;                 
	                  
				tcp_send(FLG_SYN | FLG_ACK, 28, cn_id);
	 			TRACE("T: SYN+ACK MY_SN = ",CP &conn[cn_id].my_sn,4,0);
				TRACE("T: SYN+ACK ACK_SN = ",CP &conn[cn_id].his_sn,4,0);
				conn[cn_id].my_sn++;      
				conn[cn_id].state = SYN_RCVD; 
            TRACE("STATE = SYN_RCVD",NULL,0,0); 
			}
			else 
			{         
				conn[cn_id].ipaddr = 0;
				tcp_send(FLG_RST, 20, NO_CONN);
				TRACE("T: RST @LISTEN",NULL,0,0);   
			} 
			break;

      //已發送SYN+ACK;等待ACK
		case SYN_RCVD:     
			conn[cn_id].his_sn += data_len;
			conn[cn_id].his_ack = tcp->ack_sn;
            
			if (tcp->ack_sn == conn[cn_id].my_sn) //收到ACK
			{
	         conn[cn_id].state = ESTABLISHED; 
				TRACE("R: ACK @SYN_RCVD ACK_SN = ",CP &tcp->ack_sn,4,0);
            TRACE("STATE = ESTABLISHED",NULL,0,0); 
			}
         else
         {
            tcp_send(FLG_RST, 20, NO_CONN);
         }
			break;

      //連接已建立;數據傳輸在進行
		case ESTABLISHED:
				 
			conn[cn_id].his_ack = tcp->ack_sn;
           
			if (tcp->flags & FLG_FIN)
			{	
				TRACE("R: FIN @ESTABLISHED",NULL,0,0);	   
				conn[cn_id].his_sn++;
//			   tcp_send(FLG_ACK, 20, cn_id);
// 	      TRACE("T: ACK @ESTABLISHED",NULL,0,0);

//				conn[cn_id].state = CLOSE_WAIT;               
//          TRACE("STATE = CLOSE_WAIT",NULL,0,0); 

				tcp_send(FLG_FIN | FLG_ACK, 20, cn_id);
            TRACE("T: FIN+ACK @ESTABLISHED",NULL,0,0);

				conn[cn_id].my_sn++;   
				conn[cn_id].state = LAST_ACK;
            TRACE("STATE = LAST_ACK",NULL,0,0); 
			}
			else if (data_len != 0)
			{				
				TRACE("data_len = ",CP &data_len,2,0);
		//		TRACE("R: DATA @ESTABLISHED DATA = ",inbuf+header_len+34,data_len);
				conn[cn_id].his_sn += data_len;
				
				tcp_send(FLG_ACK, 20, cn_id); 
				     	   
				result = http_server(inbuf, head_len, cn_id, 0);	
				TRACE("T: ACK @ESTABLISHED ACK_SN = ",CP &conn[cn_id].his_sn,4,0);

#ifdef OSCAR_DEBUG
				if(data_len < 20)	
					TRACE("TcpData = ",inbuf+head_len+34,data_len,0);
				else
					TRACE("TcpData len is too long,NO output",0,0,0);
#endif

#ifdef OSCAR_DEBUG
//			   memcpy(&outbuf, inbuf, len);//接收到數據返回
//				conn[cn_id].his_sn += data_len;
//			tcp_send(FLG_ACK | FLG_PSH, len, cn_id); 
#endif
				conn[cn_id].inactivity = INACTIVITY_TIME;
			}
			break;

      //收到第一個FIN,已發送ACK;等待應用程序關閉
		case CLOSE_WAIT:     
      
			break; 
      
      //已發送第二個FIN;等待ACK
		case LAST_ACK: 
			conn[cn_id].his_ack = tcp->ack_sn;		      
			if (tcp->ack_sn == conn[cn_id].my_sn)
			{
				TRACE("R: ACK @LAST_ACK ACK_SN =",CP &tcp->ack_sn,4,0);
				conn[cn_id].state = CLOSED;
				conn[cn_id].ipaddr = 0;
				TRACE("CONNECT CLOSED",NULL,0,0); 
			}
			break;

      //第一個FIN已經發送;等ACK
		case FIN_WAIT1:       
			conn[cn_id].his_sn += data_len;
			conn[cn_id].his_ack = tcp->ack_sn;
                  
			if (tcp->flags & FLG_FIN) //收到FIN報文
			{				
				conn[cn_id].his_sn++;
				tcp_send(FLG_ACK, 20, cn_id);          
				
				if (tcp->ack_sn == conn[cn_id].my_sn)	//收到FIN + ACK
				{
					conn[cn_id].state = TIME_WAIT;             
					conn[cn_id].state = CLOSED;
					conn[cn_id].ipaddr = 0;
					TRACE("R: FIN+ACK @FIN_WAIT1 ACK_SN = ",CP &tcp->ack_sn,4,0);
					TRACE("CONNECT CLOSED",NULL,0,0);				
				}
				else
				{				
					conn[cn_id].state = CLOSING;
					TRACE("R: FIN @FIN_WAIT1 ENTER CLOSING",NULL,0,0); 
				}
			}
			else if (tcp->ack_sn == conn[cn_id].my_sn) //收到ACK
			{        
         		conn[cn_id].state = FIN_WAIT2;
				TRACE("R: ACK @FIN_WAIT1 ACK_SN = ",CP &tcp->ack_sn,4,0);	
			}
			break;
          
      //第一個FIN的ACK已收到;等第二個FIN
		case FIN_WAIT2:      
			conn[cn_id].his_sn += data_len;
			conn[cn_id].his_ack = tcp->ack_sn;
      
			if (tcp->flags & FLG_FIN)
			{
				conn[cn_id].his_sn++; 
				tcp_send(FLG_ACK, 20, cn_id);
				conn[cn_id].state = TIME_WAIT;		
				conn[cn_id].state = CLOSED;
				conn[cn_id].ipaddr = 0;
				TRACE("R: FIN @FIN_WAIT2  SEND:ACK_SN = ",CP &conn[cn_id].his_sn,4,0); 			
		   }
		   break;
                        
      //收到第二個FIN,已發送ACK;等待2MSL超時      
		case TIME_WAIT:
			break;
      
		case CLOSING:
			conn[cn_id].his_ack = tcp->ack_sn;      		
			if (tcp->ack_sn == conn[cn_id].my_sn)
			{
		   	conn[cn_id].state = TIME_WAIT;
				conn[cn_id].state = CLOSED;
				conn[cn_id].ipaddr = 0;  // Free up struct area
				TRACE("R: ACK @CLOSING",CP &tcp->ack_sn,4,0);
				TRACE("CONNECT CLOSED",NULL,0,0); 				
			}
			break;       
		default:
      	break;
   }      

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人精品亚洲日本在线桃色| 一二三区精品福利视频| 久久av老司机精品网站导航| 亚洲国产成人av好男人在线观看| 中文字幕在线不卡国产视频| 亚洲精品成人精品456| 久久国产精品99精品国产 | 欧美激情一区二区三区在线| 欧美日韩精品二区第二页| 亚洲国产精品嫩草影院| 99精品国产视频| 一区二区三区91| 色综合久久88色综合天天6| 日韩中文字幕不卡| 亚洲成人手机在线| 成人aa视频在线观看| 欧美日韩精品高清| 久久精品国产一区二区三区免费看| 久久久久久麻豆| 午夜精彩视频在线观看不卡| 99re8在线精品视频免费播放| 一级做a爱片久久| 欧美zozozo| 婷婷亚洲久悠悠色悠在线播放 | 91在线观看污| 欧美高清你懂得| 国产日韩高清在线| 国产在线国偷精品产拍免费yy | 69久久99精品久久久久婷婷 | 亚洲一级二级在线| 国产69精品久久777的优势| 精品美女一区二区三区| 99视频一区二区三区| 国产精品视频一二| 成人精品一区二区三区中文字幕| 精品福利在线导航| 国产一区二区在线免费观看| 亚洲人精品一区| 国产麻豆成人精品| 亚洲一区二区三区在线播放| 国产日产欧美一区二区三区| 欧美日韩第一区日日骚| 成人av一区二区三区| 日本vs亚洲vs韩国一区三区二区| 欧美三级蜜桃2在线观看| 自拍偷自拍亚洲精品播放| 日本不卡中文字幕| 日本道免费精品一区二区三区| 最好看的中文字幕久久| 日韩一区二区视频在线观看| 免费成人你懂的| 亚洲激情欧美激情| 国产欧美日韩不卡| 911精品国产一区二区在线| 色综合天天性综合| 久久久欧美精品sm网站| 欧美中文字幕一二三区视频| 1024精品合集| 国产婷婷色一区二区三区四区 | 日韩av不卡一区二区| 中文字幕在线视频一区| 国产成人综合精品三级| 日本aⅴ精品一区二区三区| 亚洲综合久久久| 中文字幕一区视频| 国产蜜臀97一区二区三区| 精品国产成人在线影院| 日韩欧美二区三区| 国产成人免费av在线| 日韩高清欧美激情| 亚洲国产日日夜夜| 亚洲一区二区三区四区在线免费观看 | 777午夜精品视频在线播放| 欧美在线看片a免费观看| 色悠悠亚洲一区二区| eeuss国产一区二区三区| 成人免费观看视频| av亚洲产国偷v产偷v自拍| 懂色av一区二区在线播放| 国内精品久久久久影院薰衣草| 国产精品美女视频| 国产精品婷婷午夜在线观看| 亚洲国产精品99久久久久久久久| 国产亚洲精品aa午夜观看| xf在线a精品一区二区视频网站| kk眼镜猥琐国模调教系列一区二区| 国产老妇另类xxxxx| 日韩中文字幕av电影| 日韩专区中文字幕一区二区| 爽爽淫人综合网网站| 蜜臀av性久久久久蜜臀av麻豆| 亚洲欧洲成人精品av97| 亚洲色图欧美在线| 一区二区三区免费| 日韩主播视频在线| 免费成人在线影院| 国内精品伊人久久久久av影院| 国产精品99久久久久久久vr| 97久久超碰精品国产| 在线中文字幕一区| 91精品国产综合久久精品| 成人午夜在线视频| 色偷偷成人一区二区三区91| 欧美日韩免费电影| 精品久久一区二区| 国产精品视频你懂的| 亚洲影视资源网| 久久电影国产免费久久电影| 国产成人亚洲精品狼色在线| 欧美艳星brazzers| 91丝袜高跟美女视频| 欧美日韩国产综合久久| 久久麻豆一区二区| 亚洲另类春色校园小说| 蜜桃av一区二区在线观看| 成人av网站在线观看免费| 欧美日韩综合不卡| 久久久精品免费免费| 亚洲永久精品大片| 国产精品538一区二区在线| 91蜜桃传媒精品久久久一区二区| 欧美一三区三区四区免费在线看| 欧美高清在线一区二区| 五月婷婷激情综合网| 成人免费精品视频| 欧美电影在线免费观看| 日韩一区欧美小说| 久久国产精品色| 欧美在线色视频| 欧美韩日一区二区三区四区| 日韩精品一二三四| hitomi一区二区三区精品| 日韩亚洲欧美一区二区三区| 综合久久国产九一剧情麻豆| 狠狠狠色丁香婷婷综合久久五月| 91搞黄在线观看| 国产精品女同互慰在线看| 免费高清在线一区| 欧美视频日韩视频在线观看| 国产精品青草综合久久久久99| 午夜电影久久久| av电影天堂一区二区在线| 欧美不卡一区二区三区| 亚洲狠狠爱一区二区三区| 波多野结衣中文字幕一区| 欧美电视剧在线观看完整版| 一区二区在线观看免费| 东方欧美亚洲色图在线| 精品少妇一区二区三区日产乱码| 亚洲一区二区三区三| 99久久婷婷国产| 国产女人aaa级久久久级 | 亚洲色图一区二区| 成人精品视频一区| 2020日本不卡一区二区视频| 日韩精品国产欧美| 欧美在线短视频| 亚洲一区二区四区蜜桃| 91网址在线看| 中文字幕一区二区三区四区不卡| 国产成人精品影视| 久久欧美中文字幕| 国产乱码精品一区二区三| 精品久久人人做人人爰| 美腿丝袜在线亚洲一区| 欧美一卡二卡三卡| 奇米色777欧美一区二区| 欧美日韩一区不卡| 日日噜噜夜夜狠狠视频欧美人 | 日本久久精品电影| 亚洲欧美日韩一区二区 | 日韩精品三区四区| 欧美精品成人一区二区三区四区| 亚洲动漫第一页| 欧美日韩激情一区| 亚洲va韩国va欧美va精品| 91麻豆免费观看| 亚洲综合视频在线观看| 欧美日韩国产成人在线免费| 婷婷国产v国产偷v亚洲高清| 制服丝袜亚洲网站| 美女高潮久久久| 久久先锋影音av| 春色校园综合激情亚洲| 亚洲少妇最新在线视频| 在线视频综合导航| 日韩电影免费一区| 久久综合丝袜日本网| 丰满岳乱妇一区二区三区| 中文字幕亚洲不卡| 欧美日韩日本视频| 九色porny丨国产精品| 国产成人免费在线视频| 国产精品九色蝌蚪自拍| 色视频一区二区| 丝袜亚洲另类欧美| 国产亚洲欧美一级| 91精品91久久久中77777| 日韩av中文字幕一区二区| 久久九九国产精品|