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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? tcp.c

?? 單片機(jī)以太網(wǎng)上網(wǎng)代碼(KEIL工程RTS8019)
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
				return;
			}

			/* insert this tcb to tcb list isn't need. because
			this tcb is already insert at TCPSocket()*/

			/* initial new tcb value*/
			pNewTCB->TCPState	= TCP_STATE_SYNRECVD;
			pNewTCB->IPDest		= pIPHead->IPScr;
			pNewTCB->PortDest	= pTCPHead->PortScr;
			pNewTCB->PortScr	= pTCPHead->PortDest;

			pNewTCB->SeqHis = pTCPHead->Seq + 1;	/* syn is use 1 
													sequence */
			pNewTCB->WndHis = pTCPHead->WndSize;

			/* set accept function. when pNewTCB accept this
			connection call pTCB->accetp */
			pNewTCB->accept = pTCB->accept;			

			/* send syn+ack */
			TCPSendSeg(pNewTCB,TCPAllocate(0),TCP_SYN | TCP_ACK);
		}
		break;
	case TCP_STATE_SYNRECVD:

		/* ack: to TCP_STATE_ESTABLISHED */
		if((pTCPHead->flag & TCP_ACK) != 0)
			pTCB->TCPState = TCP_STATE_ESTABLISHED;

		/* call accept. Let user to know and deal more */
		pTCB->accept(pTCB);

		break;
	case TCP_STATE_SYNSENT:
		switch(pTCPHead->flag)
		{
		case TCP_SYN:
			/* syn: to TCP_STATE_SYNRECVD send syn+ack */

			pTCB->TCPState = TCP_STATE_SYNRECVD;

			/* ackseq initial */
			pTCB->SeqHis = pTCPHead->Seq + 1;	/* syn use 1 sequence */

			TCPSendSeg(pTCB,TCPAllocate(0),	TCP_SYN | TCP_ACK);
			break;
		case TCP_SYN | TCP_ACK:	
			/* syn+ack: to TCP_STATE_ESTABLISHED send ack */
	
			pTCB->TCPState = TCP_STATE_ESTABLISHED;

			/* ackseq initial */
			pTCB->SeqHis = pTCPHead->Seq + 1;	/* syn use 1 sequence */

			TCPSendSeg(pTCB,TCPAllocate(0),TCP_ACK);
			break;
		case TCP_RST | TCP_ACK:
			/* rst: to closed */
			pTCB->TCPState = TCP_STATE_CLOSED;
			TCPRelease(pTCB);
			break;
		}
		break;
	case TCP_STATE_ESTABLISHED:
		/* fin:to closewait send ack */
		if((pTCPHead->flag & TCP_FIN) != 0)
		{
			pTCB->TCPState = TCP_STATE_CLOSEWAIT;
			TCPSendSeg(pTCB,TCPAllocate(0),	TCP_ACK);

			/* call ->close() let user to know he want to close connection 
			user should call TCPClose() to close the connection in ->close */
			pTCB->close(pTCB);
		}
		break;
	case TCP_STATE_CLOSEWAIT:
		/* he want to close, send a fin to close */
		pTCB->TCPState = TCP_STATE_LASTACK;
		pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;
		TCPSendSeg(pTCB,TCPAllocate(0),	TCP_FIN | TCP_ACK);
		break;
	case TCP_STATE_FINWAIT1:
		switch(pTCPHead->flag)
		{
		case TCP_FIN:
			/* fin: to TCP_STATE_CLOSING send ack */
			pTCB->TCPState = TCP_STATE_CLOSING;
			TCPSendSeg(pTCB,TCPAllocate(0),	TCP_ACK);
			break;
		case TCP_FIN | TCP_ACK:
			pTCB->TCPState = TCP_STATE_TIMEWAIT;
			pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;	/* start timer */
			TCPSendSeg(pTCB,TCPAllocate(0),	TCP_ACK);
			break;
		case TCP_ACK:
			pTCB->TCPState = TCP_STATE_FINWAIT2;
			break;
		}
		break;
	case TCP_STATE_CLOSING:
		/* ack:to TCP_STATE_CLOSED */
		if(pTCPHead->flag & TCP_ACK)
		{
			pTCB->TCPState = TCP_STATE_TIMEWAIT;
			pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;	/* start timer */
		}
		break;
	case TCP_STATE_FINWAIT2:
		if(pTCPHead->flag & TCP_FIN)
		{
			pTCB->TCPState = TCP_STATE_TIMEWAIT;
			pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;	/* start timer */
			TCPSendSeg(pTCB,TCPAllocate(0),	TCP_ACK);
		}
		break;
	}

	/*
	 * put tcp data to uper layer 
	 */
	if(TCPDataSize != 0)
	{
		pTCB->recv(MemHead->pStart + TCP_HEAD_LEN(pTCPHead),TCPDataSize);
	}

	/*
	 * free this packet 
	 */
	MemFree(MemHead);
}

/* tcp packet in.*/
void TCPInput(struct SMemHead DT_XDATA *MemHead) REENTRANT_SIG
{
	struct SIPHead  DT_XDATA *pIPHead;
	struct STCPHead DT_XDATA *pTCPHead;
	struct STCB		DT_XDATA *pNewTCB;
	struct STCB	DT_XDATA *pTCB;
	
	pTCPHead = (struct STCPHead DT_XDATA *)(MemHead->pStart);
	pIPHead	 = (struct SIPHead  DT_XDATA *)(MemHead->pStart - sizeof(struct SIPHead));

	/*
	 * is check sum ok? 
	 */
	if(TCPCheckSum(pIPHead,ntohs(pIPHead->TotalLen) - IP_HEAD_MIN_LEN) != 0)
	{		
		MemFree(MemHead);
		return;
	}

	/* 
	 * is there a connection can accept this tcp packet?
	 */

	/* if is syn packet. a tcb in listen can accept it. */
	if(pTCPHead->flag == TCP_SYN)
	{
		for(pTCB = TCBList; pTCB != NULL; pTCB = pTCB->pNext)
		{
			if(pTCB->TCPState == TCP_STATE_LISTEN &&
				pTCB->PortScr == pTCPHead->PortDest)
			{
				break;
			}
		}
	}
	else
	{
		/* search active connections. TCBState must not the 
		closed and listen state */
		for(pTCB = TCBList; pTCB != NULL; pTCB = pTCB->pNext)
		{
			/* and the source ip, dest ip, source port, dest port
				must equal */				
			if(pTCB->PortScr == pTCPHead->PortDest &&
				pTCB->PortDest == pTCPHead->PortScr &&
				pTCB->TCPState != TCP_STATE_LISTEN &&
				pTCB->TCPState != TCP_STATE_CLOSED &&
				pTCB->IPScr  == pIPHead->IPDest &&
				pTCB->IPDest == pIPHead->IPScr)
				break;
			
		}
	}

	/* can't find, and send a rst */
	if(pTCB == NULL)
	{
		/* allocate a temp tcb for use */
		pNewTCB = TCPSocket(ntohl(pIPHead->IPDest));
		pNewTCB->IPDest 	= pIPHead->IPScr;
		pNewTCB->PortDest 	= pTCPHead->PortScr;
		pNewTCB->PortScr	= pTCPHead->PortDest;
		
		/* set MemFree DataSize to 0 */
		MemHead->pStart = MemHead->pEnd;

		TCPSendSeg(pNewTCB,TCPAllocate(0),TCP_ACK | TCP_RST);

		MemFree(MemHead);
		TCPAbort(pNewTCB);
		return;
	}

	/* 
	 *  is it a expected packet? 
	 */
	/* first change all necessary part to host order */
 #ifndef HOST_ORDER_AS_NET
	pTCPHead->AckSeq	= ntohl(pTCPHead->AckSeq);
	pTCPHead->Seq		= ntohl(pTCPHead->Seq);
	pTCPHead->WndSize	= ntohs(pTCPHead->WndSize);
#endif

	/* if it is the first packet from him, don't check sequence.
	   in connection case: a syn or syn+ack packet. in listen case
	   : a syn packet. so pass all packet contain syn flag */
	if((pTCPHead->flag & TCP_SYN) == 0)
	{
		/* sequence ok? */
		if(pTCB->SeqHis != pTCPHead->Seq)
		{
			/* if this a packet fall within rev window */
			if(TCP_SEQ_COMPARE(pTCPHead->Seq,pTCB->SeqHis) > 0
				&& TCP_SEQ_COMPARE(pTCPHead->Seq,pTCB->SeqHis) < pTCB->WndMine)
			{
				/* write it to QExceedSeq for late receive */
				TCPInsertQ(&(pTCB->QExceedSeq),MemHead,pTCPHead->Seq);
				return;
			}
			else
			{
				/* packet fall outof window, drop it. and send a ack back, because 
				this is probably ocurr when our pre send ack is lose.*/
				MemFree(MemHead);
				TCPSendSeg(pTCB,TCPAllocate(0),TCP_ACK);
				return;
			}
		}/* else sequence equal. ok */
	}/* else is syn packet */
	
	/* deal incoming packet */
	TCPRecvSeg(pTCB,MemHead);

	/* if seg in ExceedSeq can receive now? */
	while(pTCB->QExceedSeq != NULL &&
		pTCB->SeqHis == pTCB->QExceedSeq->Seq)
	{
		TCPRecvSeg(pTCB,pTCB->QExceedSeq->MemHead);
		TCPOutQ(&(pTCB->QExceedSeq));
	}
}

BOOL TCPSendEx(struct STCB DT_XDATA * pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_MUL
{
	/* if state is "closed, listen, syn recvd, syn sent", 
	need connected first */
	if(pTCB->TCPState <= TCP_STATE_SYNSENT)
	{
		MemFree(MemHead);
		return FALSE;
	}
	
	/* if unsend queue is empty */
	if(pTCB->QUnSend == NULL)
	{
		/* if this packet send completely? */
		if(TCPSendSegJudgeWnd(pTCB,MemHead) == FALSE)
		{
			/* insert the remain for later sending */
			return TCPInsertQ(&(pTCB->QUnSend),MemHead,0);
		}
		else
			return TRUE;
	}
	else
		return TCPInsertQ(&(pTCB->QUnSend),MemHead,0);
}

BOOL TCPSend(struct STCB DT_XDATA * pTCB,void DT_XDATA *buf,WORD DataSize) REENTRANT_MUL
{
	struct SMemHead DT_XDATA *MemHead;
	
	/* allocate */
	if((MemHead = TCPAllocate(DataSize)) == NULL)
		return FALSE;

	/* copy */
	MemCopy(MemHead->pStart,buf,DataSize);

	return TCPSendEx(pTCB,MemHead);
}

BOOL TCPConnect(struct STCB DT_XDATA * pTCB, DWORD DestIP, WORD DestPort,						
						void (DT_CODE * recv)(void DT_XDATA * buf,WORD size) REENTRANT_MUL,
						void (DT_CODE * close)(struct STCB DT_XDATA * pSocket) REENTRANT_MUL) REENTRANT_SIG
{
	/* is it in closed state? */
	if(pTCB->TCPState != TCP_STATE_CLOSED)
		return FALSE;

	/* tcb renew */
	pTCB->IPDest	= htonl(DestIP);
	pTCB->PortDest  = htons(DestPort);
	pTCB->recv	 = recv;
	pTCB->close	 = close;

	/* send syn */
	if(TCPSendSeg(pTCB,TCPAllocate(0),TCP_SYN) == TRUE)
	{
		pTCB->TCPState = TCP_STATE_SYNSENT;

		/* wait for establish */
		while(TRUE)
		{
			switch(pTCB->TCPState)
			{
			case TCP_STATE_ESTABLISHED:
				return TRUE;
			case TCP_STATE_CLOSED:
				/* 1. if receive a rst packet from him
				   2. retransmittimes exceed sreshold */
				return FALSE;
			}
		}
	}
	else
		return FALSE;
}
/* call this func to innitiate closing a connection. connection
will not close unless peer send a fin also.*/
void TCPClose(struct STCB DT_XDATA *pTCB) REENTRANT_MUL
{
	if(pTCB->TCPState != TCP_STATE_CLOSED)
	{
		switch(pTCB->TCPState)
		{
		case TCP_STATE_LISTEN:
			/* close right now */
			pTCB->TCPState = TCP_STATE_CLOSED;
			break;
		case TCP_STATE_SYNRECVD:
			/* close when peer send a fin */
			pTCB->TCPState = TCP_STATE_FINWAIT1;
			TCPSendSeg(pTCB,TCPAllocate(0),TCP_FIN | TCP_ACK);
			break;
		case TCP_STATE_SYNSENT:
			/* close right now */
			pTCB->TCPState = TCP_STATE_CLOSED;
			TCPRelease(pTCB);
			break;
		case TCP_STATE_ESTABLISHED:
			/* close when peer send a fin */
			pTCB->TCPState = TCP_STATE_FINWAIT1;
			TCPSendSeg(pTCB,TCPAllocate(0),TCP_FIN | TCP_ACK);
			break;
		case TCP_STATE_CLOSEWAIT:
			/* close when lastack time out */
			pTCB->TCPState = TCP_STATE_LASTACK;
			pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT;
			TCPSendSeg(pTCB,TCPAllocate(0),TCP_FIN | TCP_ACK);
			break;
		}
	}
}

BOOL TCPListen(struct STCB DT_XDATA *pTCB,WORD ScrPort,
			   void (DT_CODE * accept)(struct STCB DT_XDATA *pNewTCB) REENTRANT_MUL) REENTRANT_MUL
{
	struct STCB DT_XDATA *pTCBt;

	/* is it in closed state? */
	if(pTCB->TCPState != TCP_STATE_CLOSED)
		return FALSE;

	ScrPort = htons(ScrPort);

	/* is there any other socket already listen in this port? */
	for(pTCBt = TCBList; pTCBt != NULL; pTCBt = pTCBt->pNext)
	{
		if(pTCBt->PortScr == ScrPort)
			return FALSE;
	}

	/* renew tcb */
	pTCB->PortScr = ScrPort;
	pTCB->TCPState = TCP_STATE_LISTEN;
	pTCB->accept   = accept;

	return TRUE;
}

struct STCB DT_XDATA * TCPSocket(IP_ADDR ScrIP) REENTRANT_SIG
{
	struct STCB DT_XDATA * pTCB;
	struct STCB DT_XDATA * pTCBt;
	WORD MaxScrPort;	/* max port number in use */

	/* get a tcb */
	if((pTCB = TCPGetTCB()) == NULL)
	{
		return NULL;
	}

	/* allocate a scrport. that is number of 
	the highest	number of port in use add 1 */
	for(pTCBt = TCBList,MaxScrPort = TCP_DEFAULT_PORT;
		pTCBt != NULL; pTCBt = pTCBt->pNext)
	{
		if(ntohs(pTCBt->PortScr) > MaxScrPort)
			MaxScrPort = ntohs(pTCBt->PortScr);
	}
	pTCB->PortScr = htons((WORD)(MaxScrPort + 1));

	/* other tcb set */
	pTCB->TCPState	= TCP_STATE_CLOSED;
	pTCB->IPScr		= htonl(ScrIP);
	pTCB->WndMine	= MemFreeSize();
	pTCB->bNeedAck	= FALSE;
	pTCB->QExceedSeq	= NULL;
	pTCB->QUnacked		= NULL;
	pTCB->QUnSend		= NULL;

	/* Insert int tcb */
	TCPInsertTCB(pTCB);

	return pTCB;
}

/* reclaim TCB */
void TCPAbort(struct STCB DT_XDATA *pTCB) REENTRANT_SIG
{
	struct STCB DT_XDATA *pTCBt;

	TCPRelease(pTCB);

	/*
	 * search through the tcb list and delete it from list
	 */
	/* if it is the hear of the list */
	if(TCBList == pTCB)
	{
		TCBList = TCBList->pNext;
	}
	else
	{
		/* else search start from the second one */
		for(pTCBt = TCBList; pTCBt != NULL; pTCBt = pTCBt->pNext)
		{
			if(pTCBt->pNext == pTCB)
			{
				pTCBt->pNext = pTCB->pNext;
				break;
			}
		}
	}

	/* reclaim it. link it to TCBFreelist */
	pTCB->pNext = TCBFreeList;
	TCBFreeList = pTCB;
}
/* this func is called by user to allocate a packet and pstart
point to TCPplayload */
struct SMemHead DT_XDATA *TCPAllocate(WORD size) REENTRANT_SIG
{
	struct SMemHead DT_XDATA * MemHead;
	if((MemHead = MemAllocate((WORD)(ALL_HEAD_SIZE + size))) == NULL)
		return NULL;
	else
	{
		/* point to the tcp data */
		MemHead->pStart += ALL_HEAD_SIZE;
		return MemHead;
	}
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美无砖专区一中文字| 久久综合九色综合97婷婷女人| 9i在线看片成人免费| 成人免费看视频| 91麻豆精品国产自产在线观看一区 | 欧美国产在线观看| 久久综合久久综合九色| www欧美成人18+| 欧美不卡一区二区三区四区| 精品欧美黑人一区二区三区| 精品欧美一区二区久久 | 日韩国产在线一| 日本成人在线看| 国产精品主播直播| 成人午夜电影久久影院| 色狠狠av一区二区三区| 欧美日韩亚洲综合一区二区三区| 91精品国产综合久久精品麻豆| 日韩一区二区三区四区| 国产午夜精品久久久久久久 | www.日韩大片| 色噜噜狠狠成人中文综合| 欧美日韩中文字幕精品| 日韩欧美一二三四区| 国产三级久久久| 亚洲精品日韩综合观看成人91| 亚洲国产乱码最新视频 | 欧美日韩一区不卡| 日韩一区国产二区欧美三区| 欧美激情综合网| 亚洲视频 欧洲视频| 丝袜亚洲另类丝袜在线| 韩国欧美国产1区| 91一区一区三区| 欧美一区二区三区四区视频| 欧美极品aⅴ影院| 亚洲激情自拍视频| 免费高清在线一区| www.日韩大片| 欧美一区二区三区免费观看视频| 国产亚洲精品aa| 亚洲国产中文字幕在线视频综合| 久久国产精品免费| 成人av影院在线| 欧美日韩精品久久久| 久久精品一级爱片| 一区二区欧美精品| 国产精品一区在线观看你懂的| 91免费国产视频网站| 日韩美女在线视频| 亚洲乱码国产乱码精品精98午夜| 日韩精品久久久久久| eeuss鲁片一区二区三区在线看| 欧美老肥妇做.爰bbww视频| 国产日韩v精品一区二区| 亚洲午夜一区二区三区| 精品亚洲aⅴ乱码一区二区三区| 97超碰欧美中文字幕| 日韩欧美一二区| 亚洲激情一二三区| 国产精品一区二区在线看| 欧美无人高清视频在线观看| 国产亚洲欧美中文| 日韩电影免费在线观看网站| 成人激情免费视频| 欧美成人a视频| 亚洲网友自拍偷拍| 91精品91久久久中77777| 天涯成人国产亚洲精品一区av| 97精品久久久午夜一区二区三区| 国产人成亚洲第一网站在线播放| 粉嫩av一区二区三区| 国产精品久久久久婷婷| 99久久精品免费看国产| 亚洲成人免费观看| 91免费视频大全| 国产色产综合色产在线视频| 午夜影院在线观看欧美| 色婷婷av一区二区三区之一色屋| 26uuu亚洲综合色| 日本aⅴ免费视频一区二区三区| 一本色道亚洲精品aⅴ| 国产日韩欧美综合一区| 韩国精品一区二区| 欧美一区二区精品久久911| 亚洲线精品一区二区三区八戒| 波多野结衣中文字幕一区| 久久久久久久网| 免费在线看成人av| 欧美一区二区三区视频在线观看| 亚洲综合偷拍欧美一区色| av影院午夜一区| 亚洲乱码国产乱码精品精小说| 欧美精品少妇一区二区三区| 天堂va蜜桃一区二区三区漫画版| 99久久精品国产导航| 日本一二三不卡| 国产福利91精品一区| 亚洲精品在线网站| 国产真实乱偷精品视频免| 欧美tickling挠脚心丨vk| 青青国产91久久久久久| 欧美一卡2卡三卡4卡5免费| 五月婷婷久久丁香| 欧美精品视频www在线观看 | 欧美在线看片a免费观看| 国产精品久久久久影院亚瑟| 粉嫩久久99精品久久久久久夜| 国产欧美精品日韩区二区麻豆天美| 国产一区二区主播在线| 久久久国际精品| 成人h动漫精品一区二区| 中文字幕欧美一| 91搞黄在线观看| 亚洲第一狼人社区| 91精品综合久久久久久| 久久国内精品视频| 国产色91在线| 99re这里只有精品6| 亚洲精品乱码久久久久久黑人| 色屁屁一区二区| 成人av在线播放网址| 亚洲成av人影院在线观看网| 国产精品久久看| 成人免费在线播放视频| 裸体在线国模精品偷拍| 9191国产精品| 久久99精品久久久久久久久久久久| 26uuu另类欧美| 成人v精品蜜桃久久一区| 一区二区高清免费观看影视大全| 欧美日韩一区中文字幕| 紧缚捆绑精品一区二区| 日本一区二区三区四区| 色欧美88888久久久久久影院| 亚洲aⅴ怡春院| 久久中文娱乐网| 成人ar影院免费观看视频| 亚洲国产裸拍裸体视频在线观看乱了| 日韩一区国产二区欧美三区| 粉嫩av一区二区三区| 午夜日韩在线电影| 久久久国产精品午夜一区ai换脸 | 欧美成人a∨高清免费观看| 国产91在线看| 亚洲高清免费一级二级三级| 久久久综合九色合综国产精品| 91亚洲午夜精品久久久久久| 日韩电影在线一区二区| 国产精品久久久久久久久快鸭| 欧美日韩国产一级二级| 日韩欧美一区二区免费| 国产精品福利一区二区三区| 国产精品青草综合久久久久99| 欧美极品aⅴ影院| 欧美日韩一区二区不卡| 国产不卡视频一区二区三区| 偷拍自拍另类欧美| 中文字幕人成不卡一区| 日韩欧美综合一区| 91美女蜜桃在线| 国产精品亚洲成人| 午夜精品123| 国产精品久线观看视频| 日韩欧美一二三| 欧美视频你懂的| 99综合电影在线视频| 极品少妇xxxx精品少妇| 亚洲成人免费视频| 综合久久国产九一剧情麻豆| 久久夜色精品国产欧美乱极品| 欧美性感一区二区三区| 成人免费视频视频在线观看免费| 久久国产综合精品| 午夜精品久久久久久不卡8050| 国产精品国产自产拍在线| 久久这里都是精品| 日韩欧美亚洲国产精品字幕久久久 | 蜜臀av在线播放一区二区三区| 中文字幕中文字幕在线一区| 精品国产91洋老外米糕| 欧美高清一级片在线| 在线一区二区观看| 不卡视频在线观看| 亚洲欧美在线视频观看| 国产麻豆精品久久一二三| 99热精品国产| 国产一区二区美女| 日本午夜精品视频在线观看 | 国产午夜亚洲精品不卡| 欧美一级欧美三级在线观看| 在线观看不卡一区| 99v久久综合狠狠综合久久| 91传媒视频在线播放| 色又黄又爽网站www久久| 成人av在线电影| 成人高清视频免费观看| 99久久er热在这里只有精品66| 国产aⅴ综合色| 成人午夜av在线|