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

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

?? tcp.c

?? 單片機(jī)以太網(wǎng)上網(wǎng)代碼(KEIL工程RTS8019)
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*
 * Copyright (c) 2003 Electric Application Laboratory of NAN KAI University
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 *
 * Author: Li Zhanglin <wzzlin@nankai.edu.cn>
 *
 */

#include "..\GloblDef\GloblDef.h"
#include "..\TCPIP\TCPIPmem.h"
#include "..\TCPIP\IP.h"
#include "..\TCPIP\Netif.h"
#include "..\TCPIP\TCP.h"

struct STCB DT_XDATA TCBPool[TCP_CONNECTION_MAX_NUM];
struct STCB DT_XDATA * DT_XDATA TCBFreeList;		/* free list */
struct STCB DT_XDATA * DT_XDATA TCBList;			/* tcb in use */

struct SPacketQueue DT_XDATA QPool[TCP_QUEUE_MAX_NUM];
struct SPacketQueue DT_XDATA * DT_XDATA QFreeList;

struct STCB DT_XDATA *TCPGetTCB() REENTRANT_SIG
{
	struct STCB DT_XDATA * pTCB;
	if((pTCB = TCBFreeList) != NULL)
	{
		TCBFreeList = TCBFreeList->pNext;
	}
	return pTCB;
}

void TCPInsertTCB(struct STCB DT_XDATA *pTCB) REENTRANT_SIG
{
	pTCB->pNext = TCBList;
	TCBList = pTCB;
}

struct SPacketQueue DT_XDATA * TCPGetQ() REENTRANT_SIG
{
	struct SPacketQueue DT_XDATA * pQ;
	if((pQ = QFreeList) != NULL)
	{
		QFreeList = QFreeList->pNext;
	}
	return pQ;
}

/* insert to the head of *ppQ. Q is a double link chain */
BOOL TCPInsertQ(struct SPacketQueue DT_XDATA * DT_XDATA * ppQ,struct SMemHead DT_XDATA *MemHead,
				DWORD Seq) REENTRANT_SIG
{
	struct SPacketQueue DT_XDATA *pNewQ;
	struct SPacketQueue DT_XDATA *pQ;

	/* allocate a queue to it */
	if((pNewQ = TCPGetQ()) == NULL)
		return FALSE;

	/* write content */
	pNewQ->Seq = Seq;
	pNewQ->MemHead = MemHead;

	/* 
	 * link in the queue 
	 */

	/* if is a empty queue */
	if(*ppQ == NULL)
	{
		*ppQ = pNewQ;

		/* pNext pPre point to itself when no others in queue */
		pNewQ->pNext = pNewQ;
		pNewQ->pPre  = pNewQ;
	}
	else
	{
		pQ = *ppQ;

		/* pNext link */
		pNewQ->pNext = pQ->pNext;
		pQ->pNext    = pNewQ;

		/* pPre link */
		pNewQ->pNext->pPre	= pNewQ;
		pNewQ->pPre			= pQ;
	}
	return TRUE;
}

/* move the last unit in queue outof queue,if the queue
is empty return FALSE.actrually last unit is *ppQ */
struct SPacketQueue DT_XDATA * TCPOutQ(struct SPacketQueue DT_XDATA * DT_XDATA * ppQ) REENTRANT_SIG
{
	struct SPacketQueue DT_XDATA *pQ;

	/* a empty queue? */
	if((pQ = *ppQ) == NULL)
		return NULL;

	/* after remove it, the queue is empty? */
	if(pQ->pNext == pQ)
		*ppQ = NULL;
	else
	{
		/* relink */
		pQ->pPre->pNext = pQ->pNext;
		pQ->pNext->pPre = pQ->pPre;

		/* and the queue head *ppQ point to pQ->pPre */
		*ppQ = pQ->pPre;
	}
	
	/* relaim it. link to QFreeList */
	pQ->pNext = QFreeList;
	QFreeList = pQ;
	return pQ;
}

void TCPInit() REENTRANT_MUL
{
	WORD i;

	/* move TCBPool to TCBFreeList */
	for(i = 0, TCBFreeList = NULL; i<TCP_CONNECTION_MAX_NUM; i++)
	{
		TCBPool[i].pNext = TCBFreeList;
		TCBFreeList = &TCBPool[i];
	}

	/* move QPool to QFreeList */
	for(i = 0, QFreeList = NULL; i<TCP_QUEUE_MAX_NUM; i++)
	{
		QPool[i].pNext = QFreeList;
		QFreeList = &QPool[i];
	}

	TCBList = NULL;
}

		
/* tcp check sum. return check sum. TCPSize = TCPDataSize + TCPHeadSize*/
WORD TCPCheckSum(struct SIPHead DT_XDATA * pIPHead,WORD TCPSize) REENTRANT_SIG
{
	DWORD sum = 0;
	WORD DT_XDATA * p;
	BYTE i;

	/* clac pseudo-header CheckSum. pseudo-header is:
	   source ip, destination ip, pad 8 bits, protocol, TCP lendth */
	sum = 0;

	/* source ip and dest ip */
	p = (WORD DT_XDATA *)(&(pIPHead->IPScr));
	for(i=0; i < sizeof(DWORD)/sizeof(WORD)*2; i++,p++)
		sum += *p;
	
	/* pad 8 and protocol */
	sum += pIPHead->Protocol;

	/* tcp lendth */
	sum += TCPSize;

	return CheckSum((WORD DT_XDATA *)((BYTE DT_XDATA *)pIPHead + IP_HEAD_MIN_LEN),TCPSize,sum);
}

/* this funtion should be called periodically */
void TCPTimer() REENTRANT_MUL
{
	struct STCB DT_XDATA *pTCB;

	/* go through all tcbs to see if any time out */
	for(pTCB = TCBList; pTCB != NULL; pTCB = pTCB->pNext)
	{
		/* delayed ack need send now? */
		if(pTCB->bNeedAck == TRUE)
		{
			if(pTCB->DelayAckTimer == 0)
			{
				/* send a ack. bNeedAck will set FLASE in TCPOutput*/
				TCPSendSeg(pTCB,TCPAllocate(0),TCP_ACK);
			}
			else
				pTCB->DelayAckTimer--;
		}

		/* TCP_STATE_LASTACK TCP_STATE_TIMEWAIT state time out? */
		if(pTCB->TCPState == TCP_STATE_LASTACK ||
			pTCB->TCPState == TCP_STATE_TIMEWAIT)
		{
			if(pTCB->LastAckTimer == 0)
			{
				pTCB->TCPState = TCP_STATE_CLOSED;

				/* release buf queue and call user close */
				TCPRelease(pTCB);
				/* let pTCB->close(); to be call when they send a fin when we at established */
			}
			else
				pTCB->LastAckTimer--;
		}

		/* if retransmit timer out? */
		if(pTCB->QUnacked != NULL)
		{
			if(pTCB->RetranTimer == 0)
			{
				/* retransmit,pStart set to tcpdata */
				IPOutput(pTCB->QUnacked->MemHead);

				/* timer restart and retransmit times inc */
				if(pTCB->RetranTimes == TCP_RETRAN_MAX_TIME)
				{
					pTCB->TCPState = TCP_STATE_CLOSED;

					/* closed by countpart shut down */
					TCPRelease(pTCB);
				}
				else
				{
					pTCB->RetranTimes++;
					pTCB->RetranTimer = TCP_RETRAN_TIME_OUT;
				}
			}
			else
				pTCB->RetranTimer--;
		}
	}
}
/* when a TCP close, send too much packet but no replay, 
connection fail. TCPIP will call TCPRelease to release packet
and queue, but will not reclaim TCB. in other word user
can use this socket again. */
void TCPRelease(struct STCB DT_XDATA *pTCB) REENTRANT_SIG
{
	struct SPacketQueue DT_XDATA *pQ;

	/* reclaim Q, and free packet in queue */
	while(pQ = TCPOutQ(&(pTCB->QExceedSeq)))
		MemFree(pQ->MemHead);
	while(pQ = TCPOutQ(&(pTCB->QUnacked)))
		MemFree(pQ->MemHead);
	while(pQ = TCPOutQ(&(pTCB->QUnSend)))
		MemFree(pQ->MemHead);
}

/* fill a segment and send it,NOTE MemHead->pStart point to TCPData */
BOOL TCPSendSeg(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead,BYTE TCPFlag) REENTRANT_SIG
{
	struct STCPHead DT_XDATA 	*pTCPHead;
	struct SIPHead  DT_XDATA 	*pIPHead;
	WORD SeqInc;

	/* mem insufficient? */
	if(MemHead == NULL)
		return FALSE;

	/* SeqMine increasment */
	if((TCPFlag & TCP_SYN) || (TCPFlag & TCP_FIN))
	{
		SeqInc = MemHead->pEnd - MemHead->pStart + 1;
	}
	else
	{
		SeqInc = MemHead->pEnd - MemHead->pStart;
	}

	pTCPHead = (struct STCPHead DT_XDATA *)(MemHead->pStart - sizeof(struct STCPHead));
	
	/* fill tcp header */
	pTCPHead->PortDest		= pTCB->PortDest;
	pTCPHead->PortScr		= pTCB->PortScr;
	pTCPHead->Seq			= htonl(pTCB->SeqMine);
	pTCPHead->AckSeq		= htonl(pTCB->SeqHis);
	pTCPHead->TCPHeadLen	= (BYTE)(((BYTE)sizeof(struct STCPHead)/4)<<4);
	pTCPHead->flag			= TCPFlag;
	pTCPHead->WndSize		= htons(pTCB->WndMine = MemFreeSize());
	pTCPHead->CheckSum		= 0;
	pTCPHead->UrgentPoint	= 0;
	
	/* fill some of IPHead. it will be used to calculate TCPChecksum
	and as augument passed to IPlayer */
	pIPHead = (struct SIPHead DT_XDATA *)((BYTE DT_XDATA *)pTCPHead - IP_HEAD_MIN_LEN);
	pIPHead->IPDest					= pTCB->IPDest;
	pIPHead->IPScr					= pTCB->IPScr;
	pIPHead->Protocol				= IP_PROTOCOL_TCP;
	pIPHead->TotalLen				= htons(MemHead->pEnd - 
		MemHead->pStart + TCP_HEAD_MIN_LEN + IP_HEAD_MIN_LEN);	/* pStart point to TCP data */
	pTCPHead->CheckSum = htons(TCPCheckSum(pIPHead,MemHead->pEnd - MemHead->pStart + TCP_HEAD_MIN_LEN));
		
	/* send packet */
	MemHead->pStart = (BYTE DT_XDATA *)pIPHead;	/* dec pStart */
	IPOutput(MemHead);
	
	/*
	 * renew tcb 
	 */
	/* no ack need. because this packet will give a ack to him */
	pTCB->bNeedAck = FALSE;	

	pTCB->SeqMine += SeqInc;

	/* if this packet contant data or is a FIN or SYN packet
	we write it to unacked queue */
	if(SeqInc != 0)
	{
		/* if the unacked queue is empty, start timer for this packet */
		if(pTCB->QUnacked == NULL)
		{
			pTCB->RetranTimer = TCP_RETRAN_TIME_OUT;
			pTCB->RetranTimes = 0;
		}

		TCPInsertQ(&(pTCB->QUnacked),MemHead,htonl(pTCPHead->Seq));
	}
	else
	{
		MemFree(MemHead);
	}
	return TRUE;
}

/* judge his wnd if he can receive this packet. send call TCPSendSeg.
only send this seg completely return TRUE*/
BOOL TCPSendSegJudgeWnd(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_MUL
{
	struct SMemHead DT_XDATA *NewMemHead;
	
	/* if WndHis is large enough to receive this packet send it.
	otherwise create a new packet and send part of Data. the remain
	going to transmit when WndHis refresh at TCPInput */
	if(MemHead->pEnd - MemHead->pStart > pTCB->WndHis)
	{
		/* part of Data need send */
		if(pTCB->WndHis > 0)
		{
			/* create a new MemHead */
			if((NewMemHead = TCPAllocate(pTCB->WndHis)) == NULL)
				return FALSE;
	
			/* copy part of data to new MemHead */
			MemCopy(NewMemHead->pStart,MemHead->pStart,pTCB->WndHis);

			/* delete this part from old MemHead */
			MemHead->pStart += pTCB->WndHis;

			/* send the NewMemHead */
			TCPSendSeg(pTCB,NewMemHead,TCP_ACK);

			return FALSE;
		}
		else
		{
			/* can't send any data now */
			return FALSE;
		}
	}
	else
	{
		TCPSendSeg(pTCB,MemHead,TCP_ACK);
		return TRUE;
	}
}

/* send seg in unsend queue untill can't send any more. if send all
seg in queue return true */
BOOL TCPSendUnsendQ(struct STCB DT_XDATA *pTCB) REENTRANT_MUL
{
	/* send every packet in unsend queue if can */
	for(;pTCB->QUnSend != NULL;)
	{
		/* send it completely? */
		if(TCPSendSegJudgeWnd(pTCB,pTCB->QUnSend->MemHead) == TRUE)
		{
			/* delete it from unsend queue */
			TCPOutQ(&(pTCB->QUnSend));
		}
		else
		{
			/* only part of the seg is send */
			return FALSE;
		}
	}
	return TRUE;
}

/* call by TCPInput after judge this packet can be received.NOTE:MemHead-pStart point 
to TCP head. TCPHead byte order is change in TCPInput */
void TCPRecvSeg(struct STCB DT_XDATA *pTCB,struct SMemHead DT_XDATA *MemHead) REENTRANT_SIG
{
	WORD TCPDataSize;
	struct STCB DT_XDATA *pNewTCB;
	struct SIPHead  DT_XDATA *pIPHead;
	struct STCPHead DT_XDATA *pTCPHead;

	pTCPHead = (struct STCPHead DT_XDATA *)(MemHead->pStart );
	pIPHead	 = (struct SIPHead  DT_XDATA *)(MemHead->pStart - IP_HEAD_MIN_LEN);

	/*
	 * begain renew tcb values
	 */

	/* dest windows size renew.*/
	pTCB->WndHis = pTCPHead->WndSize;

	/* after dest windows renew is it possible to send a packet in unsend queue now ?*/
	TCPSendUnsendQ(pTCB);
		
	/* His Sequence renew */
	TCPDataSize = ntohs(pIPHead->TotalLen) - IP_HEAD_MIN_LEN 
		- TCP_HEAD_LEN(pTCPHead);
	if((pTCPHead->flag & TCP_SYN)  || (pTCPHead->flag & TCP_FIN))
	{
		pTCB->SeqHis += TCPDataSize + 1;
	}
	else
	{
		pTCB->SeqHis += TCPDataSize;
	}

	/* NeedAck? */
	if(TCPDataSize != 0)
	{
		pTCB->bNeedAck = TRUE;
		pTCB->DelayAckTimer = TCP_DELAY_ACK_TIME_OUT;
	}
	
	/* if This packet acked packet in unacked queue */
	if((pTCPHead->flag & TCP_ACK) != 0)
	{	
		while(pTCB->QUnacked != NULL &&
			TCP_SEQ_COMPARE(pTCB->QUnacked->Seq,pTCPHead->AckSeq) < 0)
		{
			MemFree(pTCB->QUnacked->MemHead); 
			TCPOutQ(&(pTCB->QUnacked));	
			
			/* timer for retran restore */
			pTCB->RetranTimer = TCP_RETRAN_TIME_OUT;
			pTCB->RetranTimes = 0;
		}
	}
	
	/*
	 * deal refer to tcb.state and tcp flag
	 */
	switch(pTCB->TCPState)
	{
	case TCP_STATE_CLOSED:
		break;
	case TCP_STATE_LISTEN:
		/* syn: to TCP_STATE_SYNSENT, send syn+ack */
		if(pTCPHead->flag == TCP_SYN)
		{
			/* create a new tcb and it is going to deal with 
			this connection. */
			if((pNewTCB = TCPSocket(htonl(pTCB->IPScr))) == NULL)
			{
				MemFree(MemHead);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品美女久久久久aⅴ| 2020国产精品自拍| 欧美日韩中字一区| 免费成人在线影院| 精品国产第一区二区三区观看体验| 精品国产欧美一区二区| 紧缚捆绑精品一区二区| 国产精品91一区二区| 精品裸体舞一区二区三区| 日本系列欧美系列| 国产精品久久久久永久免费观看| 欧美最新大片在线看 | 久久久精品综合| 成人午夜精品在线| 欧美天天综合网| 国产真实精品久久二三区| 亚洲精品成人精品456| 欧美精品一区视频| 亚洲婷婷综合久久一本伊一区| 夜夜操天天操亚洲| 国产亚洲综合在线| 7777精品伊人久久久大香线蕉完整版| 一区二区三区四区精品在线视频| 久久久久久久一区| 欧美一区二区三区影视| 国产成人在线观看| 日韩一区和二区| 色综合久久六月婷婷中文字幕| 亚洲高清免费一级二级三级| 国产日韩欧美精品在线| 91精品国产91综合久久蜜臀| 一区二区高清视频在线观看| 国产精品欧美一区喷水| 91麻豆精品国产91久久久| 成人性视频免费网站| 欧美老人xxxx18| 欧美三级乱人伦电影| 高清不卡在线观看| 欧美mv日韩mv国产网站app| 精品一区二区三区蜜桃| 国产乱国产乱300精品| 亚洲激情五月婷婷| 日韩一区在线看| 国产一区二区在线看| 亚洲成人三级小说| 亚洲亚洲人成综合网络| 91亚洲精华国产精华精华液| 99视频精品在线| 风间由美一区二区av101| 久久色在线视频| 久久精品国产精品亚洲红杏| 午夜精品成人在线| 欧美日本一区二区在线观看| 91视视频在线观看入口直接观看www | 奇米影视在线99精品| 亚洲图片欧美视频| 亚洲香蕉伊在人在线观| 在线看国产一区二区| 亚洲裸体xxx| 亚洲成人第一页| 日韩av网站免费在线| 中文乱码免费一区二区| 精品一区二区三区在线观看国产| 99亚偷拍自图区亚洲| 成人精品亚洲人成在线| 国产亚洲精品久| 久久国产欧美日韩精品| 国产成人午夜99999| 国产亚洲美州欧州综合国| 一区二区在线电影| 欧美日韩中文一区| 欧美日韩激情一区二区| 国产精品乡下勾搭老头1| 欧美激情一二三区| 亚洲精品v日韩精品| 91色porny蝌蚪| 欧美一区二区大片| 美女视频黄 久久| 欧美国产亚洲另类动漫| 亚洲精品国产一区二区三区四区在线| 97精品超碰一区二区三区| 欧美人成免费网站| 国产尤物一区二区| 专区另类欧美日韩| 日韩欧美精品在线视频| 国产一区二区福利| 一区二区三区不卡在线观看| 久久99精品国产麻豆不卡| 国产精品久久久久久久久快鸭 | 国产成人小视频| 欧美日韩三级一区| 国产大陆精品国产| 亚洲一区二区中文在线| 国产成人精品一区二| 亚洲精品五月天| 欧美mv日韩mv亚洲| 在线免费不卡视频| 国产精品1024| 激情综合色播五月| 一区二区久久久久| 久久久久久一级片| 久久成人av少妇免费| 欧美探花视频资源| 91在线视频官网| 久久99精品国产麻豆婷婷| 亚洲最快最全在线视频| 成人午夜电影久久影院| 亚洲国产成人av| 中文字幕视频一区| 亚洲尤物视频在线| 欧美日韩中文精品| 久久久精品影视| 欧美va亚洲va| 91精品国产综合久久久久| 亚洲成在线观看| 亚洲视频中文字幕| 欧美日韩黄视频| 91偷拍与自偷拍精品| 亚洲欧洲成人自拍| 国产精品99久久久久久久vr| 欧美大胆一级视频| 欧美激情一二三区| 粉嫩aⅴ一区二区三区四区| 欧美国产精品一区| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 久久久久久久久久久电影| 精品国产乱码久久| 亚洲精品视频观看| 亚洲人一二三区| 欧美日韩日日夜夜| 处破女av一区二区| 日韩欧美一级二级三级| 亚洲色图色小说| 久久夜色精品国产欧美乱极品| 一区二区三区资源| 福利一区二区在线| 日韩免费观看2025年上映的电影| 亚洲天堂av老司机| 成人免费看的视频| 精品成人在线观看| 热久久久久久久| 日本三级韩国三级欧美三级| 欧美日韩一级大片网址| 久久综合九色综合久久久精品综合| 午夜免费久久看| 日本乱码高清不卡字幕| 国产精品久久一级| 成年人午夜久久久| 综合色中文字幕| 91麻豆免费看片| 亚洲欧美日韩中文播放 | 欧美中文字幕一区二区三区亚洲| 中文字幕一区二区三区不卡在线| 国产亚洲欧美日韩日本| 国产精品白丝jk白祙喷水网站| 日韩一区二区在线播放| 免费高清成人在线| 欧美videos大乳护士334| 美女国产一区二区| 久久久久久久综合| 日韩一区中文字幕| 欧美日韩国产综合一区二区三区| 亚洲最快最全在线视频| 欧美日韩午夜精品| 久久国产免费看| 亚洲人快播电影网| 欧美精品三级在线观看| 日本欧美在线观看| 欧美韩国一区二区| 亚洲三级免费观看| 欧美日韩在线不卡| 美脚の诱脚舐め脚责91| 久久色中文字幕| 在线观看免费亚洲| 欧美日韩精品免费| 国产成人精品免费在线| 色综合一个色综合亚洲| 日本美女一区二区三区| 国产欧美日韩三级| 91免费国产在线| 欧美男生操女生| 99精品视频在线播放观看| 一区二区三区欧美在线观看| 欧美精品久久99久久在免费线| 久热成人在线视频| 91一区二区三区在线播放| 久久爱www久久做| 亚洲综合色网站| 久久精品日产第一区二区三区高清版| 中文字幕在线不卡视频| 色老头久久综合| 欧美成人性福生活免费看| 欧美一区二区高清| 夜夜嗨av一区二区三区四季av| 久久国产人妖系列| 色婷婷精品久久二区二区蜜臀av| 精品午夜一区二区三区在线观看| 亚洲欧美日韩综合aⅴ视频| 精品一区二区三区不卡| 午夜电影一区二区三区|