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

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

?? asyncsocketex.cpp

?? AsynSocketDemo.rar網(wǎng)絡(luò)代碼,可以設(shè)置代理,ssl加密. AsynSocketDemo.rar網(wǎng)絡(luò)代碼,可以設(shè)置代理,ssl加密. AsynSocketDemo.rar網(wǎng)絡(luò)代碼,
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
/*CAsyncSocketEx by Tim Kosse (Tim.Kosse@gmx.de)
            Version 1.3 (2003-04-26)
--------------------------------------------------------

Introduction:
-------------

CAsyncSocketEx is a replacement for the MFC class CAsyncSocket.
This class was written because CAsyncSocket is not the fastest WinSock
wrapper and it's very hard to add new functionality to CAsyncSocket
derived classes. This class offers the same functionality as CAsyncSocket.
Also, CAsyncSocketEx offers some enhancements which were not possible with
CAsyncSocket without some tricks.

How do I use it?
----------------
Basically exactly like CAsyncSocket.
To use CAsyncSocketEx, just replace all occurrences of CAsyncSocket in your
code with CAsyncSocketEx, if you did not enhance CAsyncSocket yourself in
any way, you won't have to change anything else in your code.

Why is CAsyncSocketEx faster?
-----------------------------

CAsyncSocketEx is slightly faster when dispatching notification event messages.
First have a look at the way CAsyncSocket works. For each thread that uses
CAsyncSocket, a window is created. CAsyncSocket calls WSAAsyncSelect with
the handle of that window. Until here, CAsyncSocketEx works the same way.
But CAsyncSocket uses only one window message (WM_SOCKET_NOTIFY) for all
sockets within one thread. When the window recieve WM_SOCKET_NOTIFY, wParam
contains the socket handle and the window looks up an CAsyncSocket instance
using a map. CAsyncSocketEx works differently. It's helper window uses a
wide range of different window messages (WM_USER through 0xBFFF) and passes
a different message to WSAAsyncSelect for each socket. When a message in
the specified range is received, CAsyncSocketEx looks up the pointer to a
CAsyncSocketEx instance in an Array using the index of message - WM_USER.
As you can see, CAsyncSocketEx uses the helper window in a more efficient
way, as it don't have to use the slow maps to lookup it's own instance.
Still, speed increase is not very much, but it may be noticeable when using
a lot of sockets at the same time.
Please note that the changes do not affect the raw data throughput rate,
CAsyncSocketEx only dispatches the notification messages faster.

What else does CAsyncSocketEx offer?
------------------------------------

CAsyncSocketEx offers a flexible layer system. One example is the proxy layer.
Just create an instance of the proxy layer, configure it and add it to the layer
chain of your CAsyncSocketEx instance. After that, you can connect through
proxies.
Benefit: You don't have to change much to use the layer system.
Another layer that is currently in development is the SSL layer to establish
SSL encrypted connections.

License
-------

Feel free to use this class, as long as you don't claim that you wrote it
and this copyright notice stays intact in the source files.
If you use this class in commercial applications, please send a short message
to tim.kosse@gmx.de
*/

#include "stdafx.h"
#include "AsyncSocketEx.h"
#include "wtypes.h"
#include "oleauto.h"
#include "atlconv.h"

#ifndef NOLAYERS
#include "AsyncSocketExLayer.h"
#endif //NOLAYERS

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif

#ifndef CCRITICALSECTIONWRAPPERINCLUDED
class CCriticalSectionWrapper
{
public:
	CCriticalSectionWrapper()
	{
		m_bInitialized = TRUE;
		InitializeCriticalSection(&m_criticalSection);
	}

	~CCriticalSectionWrapper()
	{
		if (m_bInitialized)
			DeleteCriticalSection(&m_criticalSection);
		m_bInitialized = FALSE;
	}

	void Lock()
	{
		if (m_bInitialized)
			EnterCriticalSection(&m_criticalSection);
	}
	void Unlock()
	{
		if (m_bInitialized)
			LeaveCriticalSection(&m_criticalSection);
	}
protected:
	CRITICAL_SECTION m_criticalSection;
	BOOL m_bInitialized;
};
#define CCRITICALSECTIONWRAPPERINCLUDED
#endif

CCriticalSectionWrapper CAsyncSocketEx::m_sGlobalCriticalSection;
CAsyncSocketEx::t_AsyncSocketExThreadDataList *CAsyncSocketEx::m_spAsyncSocketExThreadDataList = 0;
HMODULE CAsyncSocketEx::m_hDll = 0;
t_getaddrinfo CAsyncSocketEx::p_getaddrinfo = 0;
t_freeaddrinfo CAsyncSocketEx::p_freeaddrinfo = 0;


#ifndef _AFX
#ifndef VERIFY
#define VERIFY(x) (void(x))
#endif //VERIFY
#ifndef ASSERT
#define ASSERT(x)
#endif //ASSERT
#endif //_AFX

/////////////////////////////
//Helper Window class
#define WM_SOCKETEX_NOTIFY (WM_USER+3)
#define MAX_SOCKETS (0xBFFF-WM_SOCKETEX_NOTIFY+1)

class CAsyncSocketExHelperWindow
{
public:
	CAsyncSocketExHelperWindow()
	{
		//Initialize data
		m_pAsyncSocketExWindowData=new t_AsyncSocketExWindowData[512]; //Reserve space for 512 active sockets
		memset(m_pAsyncSocketExWindowData, 0, 512*sizeof(t_AsyncSocketExWindowData));
		m_nWindowDataSize=512;
		m_nSocketCount=0;
		m_nWindowDataPos=0;

		//Create window
		WNDCLASSEX wndclass;
		wndclass.cbSize=sizeof wndclass;
		wndclass.style=0;
		wndclass.lpfnWndProc=WindowProc;
		wndclass.cbClsExtra=0;
		wndclass.cbWndExtra=0;
		wndclass.hInstance=GetModuleHandle(0);
		wndclass.hIcon=0;
		wndclass.hCursor=0;
		wndclass.hbrBackground=0;
		wndclass.lpszMenuName=0;
		wndclass.lpszClassName=_T("ORBTSockWindowClass");
		wndclass.hIconSm=0;

		RegisterClassEx(&wndclass);

		//m_hWnd=CreateWindow(_T("ORBTSockWindowClass"), _T("ORBTSockWindowClass"), 0, 0, 0, 0, 0, 0, 0, 0, GetModuleHandle(0));
		m_hWnd = CreateWindowEx(WS_EX_TOOLWINDOW|WS_EX_NOACTIVATE, _T("ORBTSockWindowClass"), _T("ORBTSockWindowClass"),
                                WS_OVERLAPPEDWINDOW,//| WS_DISABLED,
                                -10, -10, 2, 2,
                                NULL, 0, GetModuleHandle(0), NULL);
		ASSERT(m_hWnd);
		SetWindowLongPtr(m_hWnd, GWL_USERDATA, (LONG)this);
	};

	virtual ~CAsyncSocketExHelperWindow()
	{
		//Clean up socket storage
		delete [] m_pAsyncSocketExWindowData;
		m_pAsyncSocketExWindowData=0;
		m_nWindowDataSize=0;
		m_nSocketCount=0;

		//Destroy window
		if (m_hWnd)
		{
			DestroyWindow(m_hWnd);
			m_hWnd=0;
		}
	}

	//Adds a socket to the list of attached sockets
	BOOL AddSocket(CAsyncSocketEx *pSocket, int &nSocketIndex)
	{
		ASSERT(pSocket);
		if (!m_nWindowDataSize)
		{
			ASSERT(!m_nSocketCount);
			m_nWindowDataSize=512;
			m_pAsyncSocketExWindowData=new t_AsyncSocketExWindowData[512]; //Reserve space for 512 active sockets
			memset(m_pAsyncSocketExWindowData, 0, 512*sizeof(t_AsyncSocketExWindowData));
		}

		if (nSocketIndex!=-1)
		{
			ASSERT(m_pAsyncSocketExWindowData);
			ASSERT(m_nWindowDataSize>nSocketIndex);
			ASSERT(m_pAsyncSocketExWindowData[nSocketIndex].m_pSocket==pSocket);
			ASSERT(m_nSocketCount);
			return TRUE;
		}

		//Increase socket storage if too small
		if (m_nSocketCount>=(m_nWindowDataSize-10))
		{
			int nOldWindowDataSize=m_nWindowDataSize;
			ASSERT(m_nWindowDataSize<MAX_SOCKETS);
			m_nWindowDataSize+=512;
			if (m_nWindowDataSize>MAX_SOCKETS)
				m_nWindowDataSize=MAX_SOCKETS;
			t_AsyncSocketExWindowData *tmp=m_pAsyncSocketExWindowData;
			m_pAsyncSocketExWindowData = new t_AsyncSocketExWindowData[m_nWindowDataSize];
			memcpy(m_pAsyncSocketExWindowData, tmp, nOldWindowDataSize * sizeof(t_AsyncSocketExWindowData));
			memset(m_pAsyncSocketExWindowData+nOldWindowDataSize, 0, (m_nWindowDataSize-nOldWindowDataSize)*sizeof(t_AsyncSocketExWindowData));
			delete [] tmp;
		}

		//Search for free slot
		for (int i=m_nWindowDataPos;i<(m_nWindowDataSize+m_nWindowDataPos);i++)
		{
			if (!m_pAsyncSocketExWindowData[i%m_nWindowDataSize].m_pSocket)
			{
				m_pAsyncSocketExWindowData[i%m_nWindowDataSize].m_pSocket=pSocket;
				nSocketIndex=i%m_nWindowDataSize;
				m_nWindowDataPos=(i+1)%m_nWindowDataSize;
				m_nSocketCount++;
				return TRUE;
			}
		}

		//No slot found, maybe there are too much sockets!
		return FALSE;
	}

	//Removes a socket from the socket storage
	BOOL RemoveSocket(CAsyncSocketEx *pSocket, int &nSocketIndex)
	{
		ASSERT(pSocket);
		if (nSocketIndex==-1)
			return TRUE;

		// Remove additional messages from queue
		MSG msg;
		while (PeekMessage(&msg, m_hWnd, WM_SOCKETEX_NOTIFY + nSocketIndex, WM_SOCKETEX_NOTIFY + nSocketIndex, PM_REMOVE));

		ASSERT(m_pAsyncSocketExWindowData);
		ASSERT(m_nWindowDataSize>0);
		ASSERT(m_nSocketCount>0);
		ASSERT(m_pAsyncSocketExWindowData[nSocketIndex].m_pSocket==pSocket);
		m_pAsyncSocketExWindowData[nSocketIndex].m_pSocket=0;
		nSocketIndex=-1;
		m_nSocketCount--;

		return TRUE;
	}

	void RemoveLayers(CAsyncSocketEx *pOrigSocket)
	{
		// Remove all layer messages from old socket
		std::list<MSG> msgList;
		MSG msg;
		while (PeekMessage(&msg, m_hWnd, WM_USER, WM_USER, PM_REMOVE))
		{
			//Verify parameters, lookup socket and notification message
			//Verify parameters
			if (msg.wParam >= static_cast<UINT>(m_nWindowDataSize)) //Index is within socket storage
				continue;

			CAsyncSocketEx *pSocket = m_pAsyncSocketExWindowData[msg.wParam].m_pSocket;
			CAsyncSocketExLayer::t_LayerNotifyMsg *pMsg=(CAsyncSocketExLayer::t_LayerNotifyMsg *)msg.lParam;
			if (!pMsg || !pSocket || pSocket == pOrigSocket || pSocket->m_SocketData.hSocket != pMsg->hSocket)
			{
				delete pMsg;
				continue;
			}

			msgList.push_back(msg);
		}

		for (std::list<MSG>::iterator iter = msgList.begin(); iter != msgList.end(); iter++)
			PostMessage(m_hWnd, iter->message, iter->wParam, iter->lParam);
	}

	//Processes event notifications sent by the sockets or the layers
	static LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
	{
		if (message>=WM_SOCKETEX_NOTIFY)
		{
			//Verify parameters
			ASSERT(hWnd);
			CAsyncSocketExHelperWindow *pWnd=(CAsyncSocketExHelperWindow *)GetWindowLongPtr(hWnd, GWL_USERDATA);
			ASSERT(pWnd);
			
			if (message<static_cast<UINT>(WM_SOCKETEX_NOTIFY+pWnd->m_nWindowDataSize)) //Index is within socket storage
			{
				//Lookup socket and verify if it's valid
				CAsyncSocketEx *pSocket=pWnd->m_pAsyncSocketExWindowData[message-WM_SOCKETEX_NOTIFY].m_pSocket;
				SOCKET hSocket=wParam;
				if (!pSocket)
					return 0;
				if (hSocket==INVALID_SOCKET)
					return 0;
				if (pSocket->m_SocketData.hSocket != hSocket)
					return 0;
				
				int nEvent=lParam&0xFFFF;
				int nErrorCode=lParam>>16;

				//Dispatch notification
#ifndef NOLAYERS
				if (!pSocket->m_pFirstLayer)
				{
#endif //NOLAYERS
					//Dispatch to CAsyncSocketEx instance
					switch (nEvent)
					{
					case FD_READ:
#ifndef NOSOCKETSTATES
						if (pSocket->GetState() == connecting && !nErrorCode)
						{
							pSocket->m_nPendingEvents |= FD_READ;
							break;
						}
						else if (pSocket->GetState() == attached)
							pSocket->SetState(connected);
						if (pSocket->GetState() != connected)
							break;

						// Ignore further FD_READ events after FD_CLOSE has been received
						if (pSocket->m_SocketData.onCloseCalled)
							break;
#endif //NOSOCKETSTATES
						
						if (pSocket->m_lEvent & FD_READ)
						{
							DWORD nBytes = 0;
							if (!nErrorCode)
								if (!pSocket->IOCtl(FIONREAD, &nBytes))
									nErrorCode = WSAGetLastError();
#ifndef NOSOCKETSTATES
							if (nErrorCode)
								pSocket->SetState(aborted);
#endif //NOSOCKETSTATES
							if (nBytes != 0 || nErrorCode != 0)
								pSocket->OnReceive(nErrorCode);
						}
						break;
					case FD_FORCEREAD: //Forceread does not check if there's data waiting
#ifndef NOSOCKETSTATES
						if (pSocket->GetState() == connecting && !nErrorCode)
						{
							pSocket->m_nPendingEvents |= FD_FORCEREAD;
							break;
						}
						else if (pSocket->GetState() == attached)
							pSocket->SetState(connected);
						if (pSocket->GetState() != connected)
							break;
#endif //NOSOCKETSTATES
						if (pSocket->m_lEvent & FD_READ)
						{
#ifndef NOSOCKETSTATES
							if (nErrorCode)
								pSocket->SetState(aborted);
#endif //NOSOCKETSTATES
							pSocket->OnReceive(nErrorCode);
						}
						break;
					case FD_WRITE:
#ifndef NOSOCKETSTATES
						if (pSocket->GetState() == connecting && !nErrorCode)
						{
							pSocket->m_nPendingEvents |= FD_WRITE;
							break;
						}
						else if (pSocket->GetState() == attached && !nErrorCode)
							pSocket->SetState(connected);
						if (pSocket->GetState() != connected)
							break;
#endif //NOSOCKETSTATES
						if (pSocket->m_lEvent & FD_WRITE)
						{
#ifndef NOSOCKETSTATES
							if (nErrorCode)
								pSocket->SetState(aborted);
#endif //NOSOCKETSTATES
							pSocket->OnSend(nErrorCode);
						}
						break;
					case FD_CONNECT:
#ifndef NOSOCKETSTATES
						if (pSocket->GetState() == connecting)
						{
							if (nErrorCode && pSocket->m_SocketData.nextAddr)
							{
								if (pSocket->TryNextProtocol())
                                    break;
							}
							pSocket->SetState(connected);
						}
						else if (pSocket->GetState() == attached && !nErrorCode)
							pSocket->SetState(connected);
#endif //NOSOCKETSTATES
						if (pSocket->m_lEvent & FD_CONNECT)
							pSocket->OnConnect(nErrorCode);
#ifndef NOSOCKETSTATES
						if (!nErrorCode)
						{
							if ((pSocket->m_nPendingEvents&FD_READ) && pSocket->GetState() == connected)
								pSocket->OnReceive(0);
							if ((pSocket->m_nPendingEvents&FD_FORCEREAD) && pSocket->GetState() == connected)
								pSocket->OnReceive(0);
							if ((pSocket->m_nPendingEvents&FD_WRITE) && pSocket->GetState() == connected)
								pSocket->OnSend(0);
						}
						pSocket->m_nPendingEvents = 0;
#endif
						break;
					case FD_ACCEPT:
#ifndef NOSOCKETSTATES
						if (pSocket->GetState() != listening && pSocket->GetState() != attached)
							break;
#endif //NOSOCKETSTATES
						if (pSocket->m_lEvent & FD_ACCEPT)
							pSocket->OnAccept(nErrorCode);
						break;
					case FD_CLOSE:
#ifndef NOSOCKETSTATES
						if (pSocket->GetState() != connected && pSocket->GetState() != attached)
							break;

						// If there are still bytes left to read, call OnReceive instead of 
						// OnClose and trigger a new OnClose
						DWORD nBytes = 0;
						if (!nErrorCode && pSocket->IOCtl(FIONREAD, &nBytes))
						{
							if (nBytes >0)
							{
								// Just repeat message.
								PostMessage(hWnd, message, wParam, lParam);
								pSocket->m_SocketData.onCloseCalled = true;								
								pSocket->OnReceive(0);
								break;
							}
						}

						pSocket->SetState(nErrorCode?aborted:closed);
#endif //NOSOCKETSTATES
						pSocket->OnClose(nErrorCode);
						break;
					}
				}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人毛片在线观看| 色综合视频一区二区三区高清| 欧美经典三级视频一区二区三区| 欧美性大战久久| 成人综合日日夜夜| 久久精品国产一区二区三| 一区二区三区在线播放| 久久精品人人做人人爽97| 91精品国产综合久久国产大片| 成人开心网精品视频| 久久99在线观看| 三级一区在线视频先锋| 亚洲视频1区2区| 国产欧美va欧美不卡在线| 欧美一级欧美一级在线播放| 色av一区二区| 成人av免费在线观看| 国产精品综合一区二区三区| 青青草国产精品97视觉盛宴| 一区二区三区日本| 亚洲欧美另类小说| 中文字幕在线观看不卡| 国产欧美一区二区精品婷婷 | 99久久精品国产观看| 日本三级亚洲精品| 亚洲一二三级电影| 一区二区三区欧美视频| 亚洲欧美综合色| 国产精品久久久久四虎| 久久女同精品一区二区| 精品国产99国产精品| 欧美va在线播放| 日韩欧美色综合网站| 日韩一卡二卡三卡国产欧美| 4438x成人网最大色成网站| 欧美日韩国产首页| 欧美女孩性生活视频| 在线不卡的av| 91精品国产高清一区二区三区| 欧美揉bbbbb揉bbbbb| 欧美日韩一区二区三区免费看| 色拍拍在线精品视频8848| 色狠狠色狠狠综合| 欧美视频在线一区| 欧美精品在欧美一区二区少妇| 欧美在线视频日韩| 制服丝袜激情欧洲亚洲| 欧美一二三区在线| 日韩欧美国产成人一区二区| 精品国产123| 日本一二三不卡| 亚洲日本欧美天堂| 亚洲国产精品影院| 美国精品在线观看| 国产激情精品久久久第一区二区| 成人免费视频caoporn| 色综合久久久久综合99| 欧美日韩在线播放三区四区| 337p亚洲精品色噜噜噜| 久久久久久久久久久久久久久99 | 久久久91精品国产一区二区精品| 久久久国际精品| 国产精品的网站| 亚洲不卡av一区二区三区| 日韩精品色哟哟| 韩国成人在线视频| 99精品热视频| 51精品秘密在线观看| 精品成人一区二区三区四区| 国产精品国产三级国产专播品爱网| 亚洲蜜臀av乱码久久精品| 日一区二区三区| 国产传媒久久文化传媒| 欧美无砖专区一中文字| 亚洲精品在线三区| 亚洲图片欧美激情| 蜜桃在线一区二区三区| 99久久精品免费看| 日韩视频一区二区在线观看| 国产精品女人毛片| 日韩高清在线电影| 成人av网址在线| 91麻豆精品国产91久久久使用方法 | 色综合欧美在线| 欧美精品丝袜中出| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 色婷婷国产精品综合在线观看| 欧美日本免费一区二区三区| 国产精品水嫩水嫩| 免费在线一区观看| 一本久久a久久免费精品不卡| 这里是久久伊人| 中文字幕日韩精品一区| 免费成人av在线播放| 91丝袜高跟美女视频| 久久亚洲一级片| 亚洲超碰精品一区二区| av爱爱亚洲一区| 精品国产乱码久久久久久老虎| 国产乱码字幕精品高清av | 亚洲国产成人91porn| 国产精品小仙女| 3atv一区二区三区| 亚洲综合色自拍一区| 丁香婷婷综合五月| 日韩美一区二区三区| 亚洲高清视频在线| 色婷婷av一区二区三区gif| 久久久激情视频| 老司机免费视频一区二区 | 欧美一级二级三级蜜桃| 一区二区三区四区av| 成人app网站| 久久久精品免费网站| 九九**精品视频免费播放| 欧美日韩免费电影| 亚洲一二三区视频在线观看| 91丨九色丨尤物| 中文字幕人成不卡一区| 成人美女在线视频| 亚洲国产精品精华液ab| 国产麻豆91精品| 精品国产髙清在线看国产毛片| 天使萌一区二区三区免费观看| 在线免费观看成人短视频| 亚洲美女在线一区| 91在线精品一区二区三区| 国产精品久久久久aaaa樱花 | 欧美日韩一区三区四区| 一区二区三区自拍| 色视频成人在线观看免| 亚洲免费看黄网站| 色一情一乱一乱一91av| 亚洲欧美成人一区二区三区| 福利一区在线观看| 一区精品在线播放| 国产精品乱子久久久久| 国产精品香蕉一区二区三区| 国产色产综合产在线视频| 国产成人精品一区二区三区四区 | 婷婷六月综合网| 欧美另类久久久品| 青青国产91久久久久久| 日韩精品中文字幕在线不卡尤物| 日本美女一区二区| 日韩欧美成人一区| 国内精品国产三级国产a久久| 精品91自产拍在线观看一区| 国产一区二区h| 欧美国产成人精品| 91视频你懂的| 亚洲国产va精品久久久不卡综合| 欧美老肥妇做.爰bbww| 蜜乳av一区二区| 国产人成亚洲第一网站在线播放| proumb性欧美在线观看| 亚洲综合精品自拍| 日韩写真欧美这视频| 国产精一区二区三区| 18欧美亚洲精品| 欧美日韩成人在线| 精品一区二区三区在线观看国产| 欧美国产97人人爽人人喊| 91丨九色丨蝌蚪丨老版| 五月婷婷综合激情| 久久久久久亚洲综合影院红桃| 成人短视频下载| 午夜私人影院久久久久| 久久综合五月天婷婷伊人| av激情成人网| 日韩电影免费在线观看网站| 国产嫩草影院久久久久| 欧美视频一区二区三区四区| 激情深爱一区二区| 亚洲免费av观看| 精品国产乱码久久久久久免费 | 欧美在线制服丝袜| 精品制服美女丁香| 亚洲激情网站免费观看| 精品久久人人做人人爽| 色综合天天综合网国产成人综合天| 日日摸夜夜添夜夜添亚洲女人| 国产欧美日韩视频一区二区| 欧美日韩一本到| www.日韩在线| 麻豆视频观看网址久久| 亚洲精品乱码久久久久久日本蜜臀 | 色综合激情五月| 黄色精品一二区| 亚洲韩国精品一区| 国产女同互慰高潮91漫画| 69堂亚洲精品首页| aaa亚洲精品| 国产一区二区三区最好精华液| 一二三四社区欧美黄| 欧美国产乱子伦 | 国产精品资源在线观看| 亚洲成人av一区二区三区| 国产精品色在线| 免费观看久久久4p|