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

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

?? tcp.c

?? 在S3C2440上運行的"電子日歷“(支持平年,閏年,星期自動調整). 開發環境是RVDS2.2
?? C
?? 第 1 頁 / 共 2 頁
字號:
/**---------------------版權 (c)----------------------------------------------------------***
***                     作者:顏章健                                                      ***
***                     郵件:jenkinyan@163.com                                           ***
***                                                                                       ***
***---------------------File Info---------------------------------------------------------***
*** 創 建 人:          顏章健	                                                          ***
*** 創建日期:          2008-03-27                                                        ***
*** 創建版本:                                                                            ***
*** 文件描述:          TCP(傳輸控制協議)                                               ***
***---------------------------------------------------------------------------------------***
*** 修 訂 人:          顏章健                                                            ***
*** 修訂日期:          2008-04-14                                                        ***
*** 修訂版本:                                                                            ***
*** 修訂描述:          修改TCP Socket結構:使用hook的時候不申請接收窗口緩存              ***
***---------------------------------------------------------------------------------------***
*** 修 訂 人:          顏章健                                                            ***
*** 修訂日期:          2008-05-04                                                        ***
*** 修訂版本:                                                                            ***
*** 修訂描述:          修改TCP Socket結構:省去接收窗口,去掉函數指針,發送窗口使用固定  ***
***                     緩沖區                                                            ***
***---------------------------------------------------------------------------------------***
*** 修 訂 人:          顏章健                                                            ***
*** 修訂日期:          2008-05-16                                                        ***
*** 修訂版本:                                                                            ***
*** 修訂描述:          增加條件編譯,允許配置使用與發送窗口等長的接收窗口                ***
***---------------------------------------------------------------------------------------**/
#include "config.h"
#include <math.h>

#if		MAX_TCP_SOCKETS >	0
static	TCP_SOCKET	*TcpFirstSocket;		// TCP 客戶端接口鏈表第一個接口
static	uint8		TcpTxWindowBuffer[MAX_TCP_SOCKETS][TCP_TXWINDOW_SIZE];

#if		TCP_RXWINDOW_SIZE > 0
static	uint8		TcpRxWindowBuffer[MAX_TCP_SOCKETS][TCP_RXWINDOW_SIZE];
#endif

// 函數聲明
static	void	TcpSendPacket(TCP_SOCKET *This,uint8 *Option, uint8 OLength,uint8 Flag,uint8 DatEnable);
#endif



#if	MAX_TCP_SOCKETS > 0
/********************************************************************************************
*** 函數名稱:  WindowPush
*** 函數描述:
*** 入    口:
*** 出    口:  返回實際壓入的數據長度
********************************************************************************************/
static	uint16	WindowPush(TCP_WINDOW *win,uint8 *src, uint16 len)
{
	uint32	i;
	uint16	ret;

	ret = win->BufLen - win->DatLen;
	if(ret > len)
	{
		 ret=len;
	}
	i = ret;	

	while(i--)
	{
		*win->In++ = *src++;
		if( win->In > win->End)	
		{
			win->In = win->Start;
		}
	}
	win->DatLen += ret;
	win->Size = win->BufLen - win->DatLen;
	return ret;
}

/********************************************************************************************
*** 函數名稱:  WindowPop
*** 函數描述:
*** 入    口:
*** 出    口:  實際彈出的數據長度
********************************************************************************************/
/*
static	uint16	WindowPop(TCP_WINDOW *win,uint8 *dst,uint16	len)
{
	uint32	i;
	uint16	ret;
	
	ret = win->DatLen;
	if(ret > len)
	{
		ret = len;
	}
	i = ret;
	
	while(i--)
	{
		*dst++ = *win->Out++;
		if(win->Out > win->End)
		{
			win->Out = win->Start;
		}
	}
	win->DatLen -= ret;
	win->Size = win->BufLen - win->DatLen;
	
	return	ret;
}*/

/********************************************************************************************
*** 函數名稱:  WindowGetPacket
*** 函數描述:  
*** 入    口:
*** 出    口:  實際讀出的數據長度
********************************************************************************************/
static	uint16	WindowGetPacket(TCP_WINDOW *win,uint16 ofs,NET_PKT *pkt,uint16	Length)
{
	static	NET_PKT	pkt2;
	uint8	*dat;
	uint16	len;
	
	if(ofs >= win->DatLen)
	{
		pkt->Data   = NULL;
		pkt->Length = 0;
		pkt->Next   = NULL;
		return	0;
	}
	
	len = win->DatLen - ofs;
	if(len > Length)
	{
		len = Length;
	}
	dat = win->Out + ofs;
	if(dat > win->End)
	{
		dat = win->Start + (dat - win->End) - 1;
	}
	
	pkt->Data   = dat;
	if((dat + len) > win->End)
	{
		pkt->Length = win->End - dat + 1;
		if(pkt->Next != NULL)
		{
			pkt->Next->Data   = win->Start;
			pkt->Next->Length = len - pkt->Length;
			pkt->Next->Next   = NULL;
		}
		else
		{
			pkt->Next   = &pkt2;
			pkt2.Data   = win->Start;
			pkt2.Length = len - pkt->Length;
			pkt2.Next   = NULL;
		}
	}
	else
	{
		pkt->Length = len;
		pkt->Next   = NULL;
	}
	
	return	len;	
}

/********************************************************************************************
*** 函數名稱:  WindowDel
*** 函數描述:
*** 入    口:
*** 出    口:
********************************************************************************************/
static	void	WindowDel(TCP_WINDOW *win,uint16 len)
{
	if(len > win->DatLen)
	{
		len = win->DatLen;
	}
	win->Out += len;
	if(win->Out > win->End)
	{
		win->Out = win->Start + (win->Out - win->End - 1);
	}
	win->DatLen -= len;
}

/********************************************************************************************
*** 函數名稱:
*** 函數描述:
*** 入    口:
*** 出    口:
********************************************************************************************/
static	void	WindowCreate(TCP_WINDOW	*Window,uint8 *Buffer,uint16 BufLen)
{
	Window->Start  = Buffer;
	Window->End    = Buffer + BufLen - 1;
	Window->BufLen = BufLen;
	
	Window->In     = Buffer;
	Window->Out    = Buffer;
	Window->DatLen = 0;
	Window->Size   = BufLen;
}

/********************************************************************************************
*** 函數名稱:
*** 函數描述:
*** 入    口:
*** 出    口:
********************************************************************************************/
uint16	TcpSocketSend(TCP_SOCKET	*This,uint8 *src,uint16 len)
{
	This->UREQ = UREQ_SEND;
	return WindowPush(&This->TxWindow,src,len);	
}

/********************************************************************************************
*** 函數名稱:
*** 函數描述:
*** 入    口:
*** 出    口:
********************************************************************************************/
uint16	TcpSocketRecv(TCP_SOCKET	*This,uint8 *dst,uint16 len)
{
	//return WindowPop(&This->RxWindow,dst,len);	// Changed by Yan Zhangjian(C) @ 2008-04-14	
	/*
	if(This->hook == NULL)
	{
		return WindowPop(&This->RxWindow,dst,len);	
	}
	else*/
	//{
		if(This->Rxl > 0)
		{
			uint16	i,n=0;
			for(i=len; i>0; i--)
			{
				*dst++ = *This->Rxd++;
				n++;
				if((This->Rxl--) == 0)
				{
					break;
				}
			}
			return n;
		}
		else
		{
			return 0;
		}	
	//}
}

/********************************************************************************************
*** 函數名稱:  SocketConnect
*** 函數描述:  主動發起TCP連接
*** 入    口:
*** 出    口:
********************************************************************************************/
void	TcpSocketConnect(TCP_SOCKET *This)
{
	This->UREQ = UREQ_CONN;
}

/********************************************************************************************
*** 函數名稱:  SocketClose
*** 函數描述:  主動關閉TCP連接
*** 入    口:
*** 出    口:
********************************************************************************************/
void	TcpSocketClose(TCP_SOCKET *This)
{
	This->UREQ = UREQ_CLOSE;
}

/********************************************************************************************
*** 函數名稱:  TcpSocketCreate
*** 函數描述:  創建TCP接口
*** 入    口:  
*** 出    口:  
********************************************************************************************/
//TCP_SOCKET	*TcpSocketCreate
uint8	TcpSocketCreate
	(	TCP_SOCKET	*Socket,
		uint8	*DestAddr,	uint16	DestPort,	
		uint16	LocalPort,	void	(*RecvHook)(TCP_SOCKET *)
	)
{
	int i;


	// 搜索窗口緩沖區
	{
		uint8	success;
		TCP_SOCKET	*sock;
			
		for(i=0; i<MAX_TCP_SOCKETS; i++)
		{
			success = 1;
			sock = TcpFirstSocket;
			while(sock != NULL)
			{
				if(sock->TxWindow.Start == TcpTxWindowBuffer[i])
				{
					success = 0;
					break;
				}
				else
				{
					sock = sock->Next;
				}
			}
			if(success == 1)
			{
				WindowCreate(&Socket->TxWindow,TcpTxWindowBuffer[i],TCP_TXWINDOW_SIZE);
				
				#if	TCP_RXWINDOW_SIZE > 0
				WindowCreate(&Socket->RxWindow,TcpRxWindowBuffer[i],TCP_RXWINDOW_SIZE);
				#endif
				
				break;
			}
		}		
	}
	
	if(i == MAX_TCP_SOCKETS)
	{
		return	TCP_ERR_USER;
	}
	

	Socket->TOT = 0;
	Socket->RTT  = 750;						// RTT初始化為 750 ms,采樣后自動調整
	Socket->DEV	 = 0;						// 平均方差初始化為0 added by Yan Zhangjian(C) @ 2008-04-12
	Socket->Timeout = 1500;					// 超時時間初始化為1500ms,采樣后自動調整
	Socket->TXS  = SOCKS_CLOSED;
	Socket->RXS  = SOCKS_CLOSED;
	Socket->UREQ = UREQ_NONE;
	
	// 設置Socket屬性 
	for(i=0; i<4; i++)
	{
		Socket->DestAddr[i] = *DestAddr++;	// 設置目的地址		
	}
	Socket->DestPort  = DestPort;			// 設置目的端口
	Socket->LocalPort = LocalPort;			// 設置本地端口

	if(TCP_RXWINDOW_SIZE > 1400)
	{
		Socket->MRU	= 1400;
	}	
	else
	{
		Socket->MRU	= TCP_RXWINDOW_SIZE;
	}
	Socket->MTU = 500;						// 初始化MTU為500字節,連接建立后自動調整
	Socket->DestSize = 500;					// 初始化對方窗口大小為500字節,連接建立后自動調整
	Socket->Seq = (uint32)rand();
	Socket->Ack = 0;
	Socket->LastRcvSeq = Socket->Seq - 2;
	Socket->LastRcvSeq = 0;
	Socket->hook = RecvHook;	
	
	// 將Socket插入鏈表
	Socket->Next   = TcpFirstSocket;
	TcpFirstSocket = Socket;
	
	return	TCP_ERR_NONE;
}

/********************************************************************************************
*** 函數名稱:	TcpSocketDelete		
*** 函數描述:	刪除已經創建的TCP接口		
*** 入    口:	Socket	:要刪除的接口		
*** 出    口:	無		
********************************************************************************************/
void	TcpSocketDelete(TCP_SOCKET	*Socket)
{
	TCP_SOCKET	*sock,*next;
	

	if(TcpFirstSocket == NULL)			// 鏈表為空,直接返回
	{
		return;
	}
	if(Socket == TcpFirstSocket)		// 要刪除的接口是鏈表中的第一個接口
	{
		Socket->TxWindow.Start = NULL;
		TcpFirstSocket = TcpFirstSocket->Next;
		return;
	}
	if(TcpFirstSocket->Next == NULL)	// 鏈表只有一個接口,但不是要刪除的接口
	{
		return;
	}
	
	// 鏈表有多個接口,搜索要刪除的接口
	sock = TcpFirstSocket;
	next = sock->Next;	
	while(next != NULL)
	{
		if(next == Socket)
		{
			sock->TxWindow.Start = NULL;		// Added by Yan Zhangjian(R) @ 2008-05-04
			sock->Next = next->Next;			
			break;
		}
		next = next->Next;
		sock = sock->Next;		
	}
	
}

/********************************************************************************************
*** 函數名稱:  TcpSocketReset
*** 函數描述:  復位TCP連接
*** 入    口:  
*** 出    口:  
********************************************************************************************/
void	TcpSocketReset(TCP_SOCKET	*Socket)
{
	TcpSendPacket(Socket,NULL,0,TCPFLAG_RST,0);
	Socket->TXS = SOCKS_CLOSED;
	Socket->RXS = SOCKS_CLOSED;
}


/********************************************************************************************
*** 函數名稱:	TcpCheckSum		
*** 函數描述:	TCP校驗值計算		
*** 入    口:	
*** 出    口:	
********************************************************************************************/
static	uint16	TcpCheckSum(NET_PKT *Packet)
{
	__packed	uint16	*_ptr;
	uint16	i,len;
	uint32	sum = 0;
	
	_ptr = (__packed uint16 *)Packet->Data;
	while(Packet != NULL)
	{
		_ptr = (__packed uint16 *)Packet->Data;
		len = Packet->Length >> 1;
		for(i=0; i<len; i++)
		{
			sum += *_ptr++;
		}			
		if(Packet->Next == NULL)	
		{
			break;
		}
		
		Packet = Packet->Next;
	}	
	if(Packet->Length & 0x0001)
	{
		sum += ((*_ptr)&0xff);
	}
	
	sum = (sum & 0xffff) + ((sum>>16)&0xffff);
	if(sum&0xffff0000)	sum++;
	
	return	(uint16)(sum & 0xffff);	
}

/********************************************************************************************
*** 函數名稱:	TcpSendPacket		
*** 函數描述:	運輸層發送 TCP 數據包		
*** 入    口:	This	:Socket接口
***             Data	:用戶數據緩沖區指針
***             Length	:用戶數據長度	
***             DatEnable	:	0,不允許攜帶數據;	1,允許攜帶數據	
*** 出    口:	無		
********************************************************************************************/
static	void	TcpSendPacket(	
	TCP_SOCKET	*This,
	uint8		*Option,	uint8 OLength,
	uint8		Flag,		uint8 DatEnable)
{
	uint8	TcpHead[32];
	NET_PKT	Head,Opt,Data;
	uint16	v16;
	uint32	v32;
	int		i;
	
	
	// 設置鏈表(包含偽頭部):用于計算校驗和
	Head.Data   = TcpHead;
	Head.Length = 32;
	Head.Next   = &Opt;	
	
	Opt.Data    = Option;
	Opt.Length  = OLength;
	Opt.Next    = &Data;
		
	Data.Next   = NULL;
	
	// 填充數據
	v16 = This->TxWindow.DatLen;
	if(v16 > This->MTU)			// 限制發送數據不大于對方MTU
	{
		v16 = This->MTU;
	}
	if(v16 > This->DestSize)	// 限制發送數據不大于對方窗口
	{
		v16 = This->DestSize;
	}
	
	//if(This->TXS < SOCKS_SENDREQ)
	if(DatEnable == 0)
	{
		v16 = 0;
	}	
	v16 = WindowGetPacket(&This->TxWindow,0,&Data,v16);
	v16 = v16 + OLength + 20;	// 計算TCP數據包總長
	

	// 填充偽頭部內容 TcpHead[] 的前12字節
	for(i=0; i<4; i++)
	{
		TcpHead[i]   = LinkLayer.Config.Ip[i];	// 本地地址
		TcpHead[i+4] = This->DestAddr[i];		// 目的地址
	}
	TcpHead[ 8] = 0;			TcpHead[ 9] = 6;	
	TcpHead[10] = (v16 >> 8);	TcpHead[11] = (uint8)v16;
	
	// 填充頭部內容 TcpHead[] 的后20字節
	v16 = This->LocalPort;		// 本地端口
	TcpHead[12] = (v16 >> 8);	TcpHead[13] = (uint8)v16;
	
	v16 = This->DestPort;		// 目的端口

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91首页免费视频| 日韩不卡一二三区| 丰满少妇久久久久久久| 欧美精品一区二区三| 国产高清无密码一区二区三区| 日韩欧美色综合网站| 国产在线不卡一区| 国产日韩亚洲欧美综合| www.激情成人| 玉米视频成人免费看| 精品1区2区3区| 久久精工是国产品牌吗| 国产日本欧洲亚洲| 91视视频在线观看入口直接观看www| 亚洲色图在线播放| 91精品国产欧美一区二区| 激情五月激情综合网| 中文字幕 久热精品 视频在线| 成人爱爱电影网址| 婷婷综合在线观看| 国产婷婷色一区二区三区| 色综合久久综合中文综合网| 五月婷婷综合激情| 欧美经典一区二区三区| 91精彩视频在线观看| 欧美在线999| 久久精品国内一区二区三区| 国产日产欧美一区二区视频| 欧美性色黄大片| 韩国成人在线视频| 亚洲一区二区三区精品在线| 精品免费国产二区三区| 日本高清不卡视频| 国精产品一区一区三区mba视频| 亚洲品质自拍视频网站| 精品蜜桃在线看| 91久久一区二区| 国产成人免费av在线| 亚洲国产毛片aaaaa无费看| 久久久久久9999| 欧美色偷偷大香| 成人av电影观看| 另类小说色综合网站| 亚洲综合久久久| 欧美国产禁国产网站cc| 日韩一级视频免费观看在线| 91蜜桃网址入口| 国产不卡视频在线观看| 青青草成人在线观看| 一区二区在线观看免费| 国产欧美日本一区视频| 日韩一区二区在线播放| 欧美性生活一区| 色综合天天狠狠| 成人精品电影在线观看| 精品亚洲免费视频| 日韩电影一区二区三区| 亚洲国产精品一区二区www| 日本一区二区免费在线| 久久亚洲综合色| 欧美一区二区三区精品| 欧美日韩成人一区二区| 91成人在线观看喷潮| 99久久免费精品高清特色大片| 激情综合网最新| 老鸭窝一区二区久久精品| 亚洲国产aⅴ成人精品无吗| 一区二区视频在线| 亚洲欧美日韩国产综合在线 | 制服丝袜av成人在线看| 色吊一区二区三区| 日本高清无吗v一区| 一本色道久久加勒比精品 | 成人午夜激情片| 国产精品456露脸| 国产精品一区一区三区| 国产一区二区视频在线播放| 久久99久久久久久久久久久| 美女高潮久久久| 久久精品理论片| 国产一区二区美女诱惑| 国产精品1区2区| 亚洲自拍偷拍av| 国产精品麻豆网站| 国产情人综合久久777777| 精品国产91乱码一区二区三区| 成人福利视频网站| 欧美aa在线视频| 亚洲激情校园春色| 亚洲精品一区二区三区在线观看| 成人妖精视频yjsp地址| 免费欧美在线视频| 曰韩精品一区二区| 亚洲免费大片在线观看| 在线观看视频欧美| 欧美体内she精视频| 欧美日韩二区三区| 欧美一区二区精品久久911| 91精品综合久久久久久| 26uuu国产在线精品一区二区| 久久久久9999亚洲精品| 日韩理论片网站| 亚洲一区二区在线播放相泽| 日韩黄色一级片| 国产一区二区三区精品视频| 99久久婷婷国产综合精品电影 | 欧美视频一区二区三区四区| 日本亚洲三级在线| 国产精品久久久久久久久免费丝袜| 欧美tickling挠脚心丨vk| 91丨porny丨户外露出| 大陆成人av片| 91欧美激情一区二区三区成人| 99视频热这里只有精品免费| 成人免费看的视频| 欧美午夜精品久久久久久孕妇| 欧美午夜精品电影| 91麻豆精品国产91久久久久久久久 | 717成人午夜免费福利电影| 欧美一区二区三区在| 日韩欧美综合一区| 欧美性欧美巨大黑白大战| 国产精品亚洲视频| 激情综合色播激情啊| 亚洲三级免费电影| 777a∨成人精品桃花网| 在线观看免费一区| 日韩亚洲欧美一区| 一区二区三区四区在线| 午夜电影一区二区三区| 成人免费视频一区二区| 色综合久久88色综合天天6| 日韩欧美不卡在线观看视频| 国产精品欧美久久久久无广告| 国产欧美一区二区三区网站 | 欧美乱熟臀69xxxxxx| 欧美一区二区久久久| 国产精品免费aⅴ片在线观看| 天堂久久久久va久久久久| 丁香六月综合激情| 日韩一区二区精品在线观看| 亚洲私人黄色宅男| 国产精品一二三四区| 制服丝袜中文字幕一区| 亚洲一区在线免费观看| 国产suv一区二区三区88区| 欧美一区二区视频网站| 亚洲夂夂婷婷色拍ww47| 成人app下载| 日本一区二区三区四区| 激情成人午夜视频| 日韩一本二本av| 调教+趴+乳夹+国产+精品| 在线观看国产精品网站| 国产精品初高中害羞小美女文| 国产伦精品一区二区三区视频青涩| 91精品免费观看| 亚洲成人福利片| 欧美色老头old∨ideo| 亚洲视频在线观看三级| 99这里只有精品| 国产精品美女久久久久aⅴ| 国产在线视频精品一区| 精品对白一区国产伦| 加勒比av一区二区| 精品国产精品一区二区夜夜嗨| 蜜桃视频在线观看一区| 欧美喷水一区二区| 在线观看不卡一区| 成人av动漫网站| 婷婷久久综合九色综合绿巨人| 精品久久久久香蕉网| www.欧美精品一二区| 成人教育av在线| 亚洲成a人片在线不卡一二三区| 日韩欧美一级二级三级久久久| 国产裸体歌舞团一区二区| 亚洲欧美日韩国产一区二区三区| 日韩一级视频免费观看在线| 在线观看一区日韩| 欧美在线视频全部完| 亚洲永久免费av| 欧美日韩一区二区三区不卡| 亚洲狠狠爱一区二区三区| 欧美日韩中文字幕精品| 日本美女一区二区| 精品国产免费一区二区三区香蕉 | 久久综合九色综合97婷婷女人 | 欧美综合亚洲图片综合区| 性感美女极品91精品| 日韩一区二区电影| 国产一区视频在线看| 日本一区二区三区免费乱视频 | 日韩欧美在线123| 国产麻豆成人传媒免费观看| 欧美国产乱子伦| 欧美亚洲动漫精品| 蜜臀av一区二区三区| 久久精品一二三| 91久久香蕉国产日韩欧美9色|