青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 298  文章 - 377  trackbacks - 0
<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用鏈接

留言簿(34)

隨筆分類

隨筆檔案

文章檔案

相冊

收藏夾

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

Windows2000之后的版本提供的完成端口的應用,這使得開發服務器端程序變得更簡便了,我們不用再為每一個連接而去維護令人厭煩的線程池。Windows提供的完成端口封裝了一切繁瑣的工作,我們唯一要做的就是對完成端口的應用。

// 創建監聽套接字
SOCKET m_socListen = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
// 設置異步連接標志
if (WSAAsyncSelect(m_socListen, m_hMainWnd, UM_SOCKETEVENT, FD_ACCEPT)==SOCKET_ERROR) return SOCKET_ERROR;
// 初始化完成端口
IOCP_Initialize();
/*
IOCP_Initialize()
{
SYSTEM_INFO systeminfo;
DWORD dwThreadID;
m_hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
if( m_hCompletionPort == NULL 
{
TRACE(_T("CreateIoCompletionPort failed with error: %d\n", GetLastError());
return -1;
}
m_bStopIOCP=FALSE;
m_hThreadIOCP=NULL;
GetSystemInfo( &systeminfo ;
for(DWORD i=0; i<systeminfo.dwNumberOfProcessors; i++)
{
m_hThreadIOCP = CreateThread( NULL, // Security
0, // Stack size - use default
(LPTHREAD_START_ROUTINE)IOCP_ThreadPoolFunc, // Thread function entry point
(void*) this, // Param for thread
0, // Init flag
&dwThreadID); // Thread ID
        if (m_hThreadIOCP!=NULL) 
{
InterlockedIncrement((LPLONG)&m_nWorkerCnt);
CloseHandle(m_hThreadIOCP);
}
}
}

IOCP_ThreadPoolFunc (LPVOID lpParam)    
{
ASSERT(lpParam);
CIOCPServer* pThis = reinterpret_cast<CIOCPServer*>(lpParam);
HANDLE hCompletionPort = pThis->m_hCompletionPort;

DWORD dwBytesTransferred=0; // Bytes transferred in the Completion packet
DWORD dwIoType=0; // The operation type of completion packet
DWORD dwFlags=0;

LPPERHANDLEDATA lpPerHandleData;
LPPERIOOPERATIONDATA lpPerIoData;

while(!pThis->IsIOCPstopped())
{
BOOL bIoRet = FALSE;
if((bIoRet = GetQueuedCompletionStatus(
hCompletionPort,
&dwBytesTransferred,
(LPDWORD) &lpPerHandleData,
(LPOVERLAPPED*)&lpPerIoData,
INFINITE))==0)
{
DWORD dwError=GetLastError();
if(dwError==ERROR_NETNAME_DELETED)
{
// 服務器主動關閉套接字
if(lpPerIoData) { pThis->FreePerIoData(lpPerIoData); lpPerIoData=NULL; };
/*
FreePerIoData(PERIOOPERATIONDATA* lpPerIoData)
{
if(lpPerIoData->m_pOutBuf)
{
delete[] lpPerIoData->m_pOutBuf;
lpPerIoData->m_pOutBuf=NULL;
}
delete(lpPerIoData);
lpPerIoData=NULL;
}
*/
continue;
}

TRACE("GetQueuedCompletionStatus failed with error %d\n", dwError);
InterlockedDecrement(&pThis->m_nWorkerCnt);
return 0;
}

if(lpPerIoData==NULL && lpPerHandleData==NULL)
{
// 服務器關閉完成端口
InterlockedDecrement(&pThis->m_nWorkerCnt);
return 0;
}

// First check to see if an error has occured on the socket and if so
// then close the socket and cleanup the SOCKET_INFORMATION structure
// associated with the socket.
if ((dwBytesTransferred==0) && ((lpPerIoData->m_ioType==IORead)||(lpPerIoData->m_ioType==IOWrite)))
{
pThis->RemoveStaleClient(lpPerHandleData->m_Socket,FALSE);
if(lpPerIoData) { pThis->FreePerIoData(lpPerIoData); lpPerIoData=NULL;
continue;
}

if( lpPerHandleData!=NULL && lpPerIoData!=NULL 
{
BOOL bRet = pThis->IOCP_ProcessIOMessage(lpPerHandleData, lpPerIoData, dwBytesTransferred);

// Before Every PostQueuedCompletionStatus() call we allocate a memory for PerIoData.
// And Before every WSASend() and WSARecv() call we also allocate such a block of memory.
// So After handling every QueuedCompletion Packet, we Free this block if it's not useful.

/*
enum IOType { IOIdle,IORead,IOWrite,IOInitialize };
IOCP_ProcessIOMessage(PERHANDLEDATA* pContext, PERIOOPERATIONDATA* pPerIoData, DWORD dwSize = 0)
{
int nRet = 0; 
IOType clientIO = pPerIoData->m_ioType; 

if( clientIO == IOInitialize)
nRet = IOCP_OnClientInitializing(pContext, pPerIoData, dwSize);
else if( clientIO == IORead)
nRet = IOCP_OnClientReading(pContext, pPerIoData, dwSize);
else if( clientIO == IOWrite)
nRet = IOCP_OnClientWriting(pContext, pPerIoData, dwSize);
}

IOCP_OnClientInitializing(PERHANDLEDATA* lpContext, PERIOOPERATIONDATA* lpPerIoData, DWORD dwIoSize)
{
// launch another recv operation.
DWORD dwBytesTransferred=0;
PERIOOPERATIONDATA*  lpPerIoDataResv = new PERIOOPERATIONDATA;
memset(lpPerIoDataResv,0,sizeof(PERIOOPERATIONDATA));
lpPerIoDataResv->m_ioType = IORead;
lpPerIoDataResv->m_wsaDataBuf.buf = lpPerIoDataResv->m_Buffer;
lpPerIoDataResv->m_wsaDataBuf.len = sizeof(lpPerIoDataResv->m_Buffer);

ULONG ulFlags = 0;
int nRet = WSARecv( lpContext->m_Socket,
&lpPerIoDataResv->m_wsaDataBuf,
1,
&dwBytesTransferred,
&ulFlags,
(LPWSAOVERLAPPED)&lpPerIoDataResv->Overlapped,
NULL);

if ( nRet == SOCKET_ERROR 
{
DWORD dwError = WSAGetLastError();
if( dwError != WSA_IO_PENDING) 
{
RemoveStaleClient( lpContext->m_Socket, FALSE ;
return NC_E_IOCP_INITIALIZE|dwError;
}
}
}

IOCP_OnClientReading(PERHANDLEDATA* pContext, PERIOOPERATIONDATA* pPerIoData, DWORD dwSize)
{
// make sure to issue a read after this
// pContext->m_wsaInBuffer.buf/*==pContext->m_byInBuffer*/是該套接字的緩沖區,
// 如果該緩沖區中有數據(pContext->m_wsaInBuffer.len!=0時),
// 則說明上次收到了一個請求包的一部分數據,把這次的數據繼續放入
memmove(pContext->m_wsaInBuffer.buf+pContext->m_wsaInBuffer.len,pPerIoData->m_wsaDataBuf.buf,dwSize);
pContext->m_wsaInBuffer.len+=dwSize;
HandleRequest(pContext);

// launch another recv operation.
DWORD dwBytesTransferred=0;
PERIOOPERATIONDATA*  lpPerIoDataResv = new PERIOOPERATIONDATA;
memset(lpPerIoDataResv,0,sizeof(PERIOOPERATIONDATA));
lpPerIoDataResv->m_ioType = IORead;
lpPerIoDataResv->m_wsaDataBuf.buf = lpPerIoDataResv->m_Buffer;
lpPerIoDataResv->m_wsaDataBuf.len = sizeof(lpPerIoDataResv->m_Buffer);

int nRet = WSARecv( pContext->m_Socket,
&lpPerIoDataResv->m_wsaDataBuf,
1,
&dwBytesTransferred,
&ulFlags,
(LPWSAOVERLAPPED)&lpPerIoDataResv->Overlapped,
NULL);

if ( nRet == SOCKET_ERROR 
{
DWORD dwError = WSAGetLastError();
if( dwError != WSA_IO_PENDING && dwError != WSAENOTSOCK) 
{
RemoveStaleClient( pContext->m_Socket, FALSE ;
return NC_E_IOCP_READ|dwError;
}
}
}

IOCP_OnClientWriting(PERHANDLEDATA* pContext, PERIOOPERATIONDATA* pPerIoData, DWORD dwSize)
{
// SendPacket調用異步發送數據,當數據發送完成后,將來此處
}

SendPacket(PERHANDLEDATA* pContext,BYTE* sendbuf,DWORD dwLength)
{
// 發送數據代碼斷如下:
PERIOOPERATIONDATA*  lpPerIoDataRPP = new PERIOOPERATIONDATA;
memset(lpPerIoDataRPP,0,sizeof(PERIOOPERATIONDATA));
lpPerIoDataRPP->m_ioType = IOWrite;
memset(lpPerIoDataRPP->m_Buffer,0,sizeof(lpPerIoDataRPP->m_Buffer));
lpPerIoDataRPP->m_pOutBuf=new BYTE[dwLength];
memmove(lpPerIoDataRPP->m_pOutBuf,(BYTE*)sendbuf,dwLength);
lpPerIoDataRPP->m_wsaDataBuf.buf = (char*)lpPerIoDataRPP->m_pOutBuf;
lpPerIoDataRPP->m_wsaDataBuf.len = dwLength;
int nRetVal = WSASend(pContext->m_Socket,
&lpPerIoDataRPP->m_wsaDataBuf,
1,
&lpPerIoDataRPP->m_wsaDataBuf.len, 
0,
&(lpPerIoDataRPP->Overlapped), 
NULL);
if ( nRetVal == SOCKET_ERROR 
{
DWORD dwError=WSAGetLastError();
if( dwError != WSA_IO_PENDING  
{
RemoveStaleClient( socClient, FALSE ;
return NC_E_TCP_SENDRESPONSE|dwError;
}
}
// 發送完畢
}
*/

if( lpPerIoData  { pThis->FreePerIoData(lpPerIoData); lpPerIoData=NULL; }
}
}

InterlockedDecrement(&pThis->m_nWorkerCnt);

return 0;
}
*/

// 綁定服務器地址
SOCKADDR_IN saiServer;
saiServer.sin_family = AF_INET;
saiServer.sin_port   = htons(NC_S_PORT_LISTEN);
saiServer.sin_addr.S_un.S_addr = inet_addr(pszLocalAddr);
if(bind(m_socListen,(SOCKADDR*)&saiServer,sizeof(saiServer))==SOCKET_ERROR) return NC_E_TCP_LISTEN|WSAGetLastError();
// 開始偵聽
if(listen(m_socListen,SOMAXCONN)==SOCKET_ERROR) return NC_E_TCP_LISTEN|WSAGetLastError();


case FD_ACCEPT: IOCP_OnAccept();break;

IOCP_OnAccept()
{
SOCKET socClient;
SOCKADDR_IN saiRemote;
int nLen = sizeof(saiRemote);
if( (socClient=accept(m_socListen,(LPSOCKADDR)&saiRemote,&nLen))==SOCKET_ERROR) return NC_E_TCP_ONACCEPT|WSAGetLastError();

// 1、設置套接字選項
BOOL bOpt = true;
int nRcvBuf = BUFSIZE_NC_S_RCVBUF;
int nSndBuf = BUFSIZE_NC_S_SNDBUF;
int nErr = 0;
int nTimeout = 10*1000;
nErr = setsockopt(socClient, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeout, sizeof(nTimeout));
nErr = setsockopt(socClient, SOL_SOCKET, SO_RCVBUF, (const char*)&nRcvBuf,sizeof(nRcvBuf));
nErr = setsockopt(socClient, SOL_SOCKET, SO_SNDBUF, (const char*)&nSndBuf,sizeof(nSndBuf));

// 2、將該套接字關聯完成端口
// Create the Client context to be associted with the completion port
PERHANDLEDATA* pContext = IOCP_AllocatePerHandleContext();

/*
typedef struct tagPerHandleData
{
SOCKET m_Socket;
DWORD  m_dwStatus;

// Input Elements for Winsock
WSABUF m_wsaInBuffer;
BYTE   m_byInBuffer[DATA_BUFSIZE];    

// Output elements for Winsock
WSABUF m_wsaOutBuffer;

}PERHANDLEDATA, *LPPERHANDLEDATA;

IOCP_AllocatePerHandleContext()
{
PERHANDLEDATA* pContext = NULL;
if (!m_listFreePool.IsEmpty())
{
pContext = m_listFreePool.RemoveHead();
}
else
{
pContext = new PERHANDLEDATA;
memset(pContext,0,sizeof(PERHANDLEDATA));
}
if(pContext) memset(pContext,0,sizeof(PERHANDLEDATA));
return pContext;
}
*/

pContext->m_Socket = socClient;
pContext->m_wsaInBuffer.buf = (char*)pContext->m_byInBuffer;
pContext->m_wsaInBuffer.len = 0;

// 保存PerHandleContext的列表
PERHANDLEDATA* pContextTmp = NULL;
if (m_listContexts.Lookup(socClient, pContextTmp))
RemoveStaleClient(socClient,TRUE);
else
m_listContexts.SetAt(nSocket, pContext);

/*
RemoveStaleClient(SOCKET s,BOOL bGraceful)
{
PERHANDLEDATA* pContext=NULL;
m_listContexts.Lookup(nSocket,pContext);
if(pContext==NULL) return;

LINGER lingerStruct;
if ( bGraceful  
{
lingerStruct.l_onoff = 1;
lingerStruct.l_linger= 30; // linger for 30 seconds, 0 for abort
}
else
{
lingerStruct.l_onoff = 0;
lingerStruct.l_linger= 0; // ignored
}
setsockopt( pContext->m_Socket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct) ;
while (!HasOverlappedIoCompleted((LPOVERLAPPED)pContext)) Sleep(0);
MoveToFreePool(nSocket);

//
//MoveToFreePool(SOCKET s)
//{
// PERHANDLEDATA* pContext = NULL;
//
//    // Free context structures
// if (m_listContexts.Lookup(nSocket, pContext)) 
// {
// m_listFreePool.AddTail(pContext);
// m_listContexts.RemoveKey(nSocket);
// }
//}
//

// Free context structures
// Now close the socket handle.  This will do an abortive or  graceful close, as requested.  
closesocket( pContext->m_Socket ;
pContext->m_Socket = INVALID_SOCKET;
}
*/

// Associate the new socket with a completion port.
if(IOCP_AssociateSocketWithPort(pContext->m_Socket, m_hCompletionPort, (DWORD)pContext)!=0)
{
        RemoveStaleClient(socClient,TRUE);
DWORD dwError=GetLastError();
return NC_E_TCP_ONACCEPT;
}
/*
IOCP_AssociateSocketWithPort(SOCKET socket, HANDLE hCompletionPort, DWORD dwCompletionKey)
{
HANDLE h=CreateIoCompletionPort((HANDLE) socket, hCompletionPort, dwCompletionKey, 0);
return (h==hCompletionPort)?0:-1;
}
*/

// 3、該套接字的完成端口初始化
// Trigger first IO Completion Request
// Otherwise the Worker thread will remain blocked waiting for GetQueuedCompletionStatus...
// The first message that gets queued up is ClientIoInitializing - see ThreadPoolFunc 
/*
typedef struct tagPerIoOperationData
{
OVERLAPPED Overlapped;
IOType m_ioType;

BYTE*  m_pOutBuf;
WSABUF m_wsaDataBuf;
CHAR   m_Buffer[DATA_BUFSIZE];

} PERIOOPERATIONDATA,*LPPERIOOPERATIONDATA;
*/
PERIOOPERATIONDATA*  lpPerIoData = NULL;
lpPerIoData = new PERIOOPERATIONDATA;
memset(lpPerIoData,0,sizeof(PERIOOPERATIONDATA));
lpPerIoData->m_ioType = IOInitialize;
lpPerIoData->m_wsaDataBuf.len = sizeof(lpPerIoData->m_Buffer);
lpPerIoData->m_wsaDataBuf.buf = lpPerIoData->m_Buffer;
BOOL bSuccess = PostQueuedCompletionStatus(m_hCompletionPort, 0, (DWORD) pContext, &lpPerIoData->Overlapped);
if(!bSuccess) return NC_E_TCP_ONACCEPT|WSAGetLastError();
return socClient;
}

// 結束的時候需要關閉完成端口
CloseListenSocket()
{
// 關閉每個連接, 從列表中移去關鍵字
PERHANDLEDATA* pContext = NULL;
int nSocket=0;
do
{
POSITION pos  = m_listContexts.GetStartPosition();
if (pos)
{
m_listContexts.GetNextAssoc(pos, nSocket, pContext);
RemoveStaleClient(nSocket, FALSE);
}
}while (!m_listContexts.IsEmpty());

// 釋放每個連接相關的分配內存
while (!m_listFreePool.IsEmpty())
{
PERHANDLEDATA* pContext = m_listFreePool.RemoveTail();
delete pContext;
}

m_bStopIOCP=TRUE;

if(m_bIOCPInitialed==TRUE)
{
IOCP_CloseCompletionPort();
/*
IOCP_CloseCompletionPort()
{
while (m_nWorkerCnt)
{
PostQueuedCompletionStatus(m_hCompletionPort, 0, (DWORD) NULL, NULL);
Sleep(1000);
}
// Close the CompletionPort and stop any more requests
CloseHandle(m_hCompletionPort);
m_bIOCPInitialed=FALSE;
m_bStopIOCP=TRUE;
}
} */
}

if(m_socListen!=0)
{
closesocket(m_socListen);
m_socListen=0;
}
return 0;
}
posted on 2007-08-17 13:10 聶文龍 閱讀(851) 評論(0)  編輯 收藏 引用 所屬分類: net work
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲第一精品福利| 欧美激情中文不卡| 最新热久久免费视频| 欧美日韩在线精品一区二区三区| 亚洲欧美怡红院| 午夜精品国产更新| 亚洲一区二区三区精品动漫| 欧美国产三区| 亚洲乱码国产乱码精品精天堂| 亚洲精品国产精品乱码不99按摩| 老司机免费视频一区二区| 久久国产免费| 免费影视亚洲| 日韩午夜在线电影| 亚洲视频精选在线| 久久精品30| 欧美成年人视频网站欧美| 欧美日韩亚洲成人| 欧美日韩中文精品| 欧美日韩国产小视频| 欧美日韩精品欧美日韩精品| 国产精品久久久久国产精品日日 | 老牛国产精品一区的观看方式| 亚洲一卡久久| 欧美大片一区二区| 亚洲女同性videos| 欧美顶级艳妇交换群宴| 国产日韩亚洲欧美综合| 亚洲国产欧美一区二区三区久久 | 国产精品永久入口久久久| 国产婷婷色综合av蜜臀av| 99ri日韩精品视频| 久久最新视频| 久久www成人_看片免费不卡| 欧美剧在线观看| 国内成人精品视频| 久久精品人人爽| 亚洲自拍三区| 国产精品永久| 久久久久国产精品麻豆ai换脸| 亚洲精品一区二区三区蜜桃久| 久久久久欧美| 亚洲国产裸拍裸体视频在线观看乱了| 欧美亚洲综合另类| 欧美护士18xxxxhd| 在线观看欧美亚洲| 久久嫩草精品久久久精品一| 久久久国产精品一区| 亚洲第一页在线| 亚洲欧洲日本专区| 久久这里有精品视频| 欧美一级淫片播放口| 一区二区在线观看av| 欧美大香线蕉线伊人久久国产精品| 性色av一区二区三区| 亚洲欧洲三级电影| 9l视频自拍蝌蚪9l视频成人| 国产日韩一区在线| 欧美福利电影在线观看| 欧美色欧美亚洲另类二区| 亚洲欧美中日韩| 米奇777超碰欧美日韩亚洲| 久久久亚洲午夜电影| 日韩亚洲精品电影| 欧美中文在线视频| 亚洲一二三区在线| 久久亚洲欧洲| 久久成人精品一区二区三区| 欧美福利在线| 欧美国产一区在线| 久久嫩草精品久久久精品一| 亚洲综合色婷婷| 欧美日韩国产另类不卡| 老司机亚洲精品| 国产一级久久| 欧美一区=区| 亚洲欧美在线播放| 国产精品成人一区二区网站软件 | 免费在线观看精品| 国产精品区一区二区三| 亚洲精品在线视频| 亚洲国产精品欧美一二99| 欧美一区二区精美| 久久精品人人做人人综合| 国产精品久久久亚洲一区| 一区二区三区免费在线观看| 91久久精品一区二区别| 欧美夫妇交换俱乐部在线观看| 欧美成人综合在线| 99re热这里只有精品视频| 欧美私人网站| 午夜久久久久久| 久久久久久久波多野高潮日日| 在线免费不卡视频| 欧美激情一区二区三区不卡| 亚洲美女诱惑| 久久精品国产第一区二区三区| 在线播放不卡| 欧美日韩一区视频| 久久国产主播| 99国内精品| 欧美大色视频| 久久久久女教师免费一区| 亚洲日韩第九十九页| 国产日韩精品久久| 欧美激情视频网站| 久久久久99| 在线视频欧美一区| 欧美黄免费看| 久久免费一区| 欧美在线免费观看| 亚洲免费大片| 亚洲人成人一区二区在线观看| 国产精品夫妻自拍| 欧美欧美天天天天操| 欧美高潮视频| 欧美日韩亚洲国产一区| 亚洲一区二区三区三| 美女在线一区二区| 亚洲激情在线| 欧美国产日韩精品免费观看| 欧美一区二区三区四区在线观看地址 | 亚洲二区在线观看| 在线视频国内自拍亚洲视频| 韩国一区二区在线观看| 国产日韩在线不卡| 激情久久五月天| 亚洲日本aⅴ片在线观看香蕉| 亚洲精品一区中文| 亚洲欧美成人一区二区三区| 午夜精品久久久久影视| 久久久久久久久综合| 亚洲第一在线| 欧美亚洲在线| 欧美精品久久久久久久久久| 国产精品最新自拍| 亚洲精品日日夜夜| 久久综合狠狠| 一区二区三区鲁丝不卡| 欧美成人精品激情在线观看| 国产精品任我爽爆在线播放| 亚洲高清不卡一区| 欧美一区二视频| 日韩亚洲成人av在线| 久久蜜桃香蕉精品一区二区三区| 欧美三级网页| 日韩一级精品| 亚洲高清不卡av| 久久精品成人欧美大片古装| 国产精品久久国产精麻豆99网站| 欧美中文在线观看国产| 另类亚洲自拍| 久久精品视频在线免费观看| 欧美精品情趣视频| 亚洲毛片一区二区| 欧美激情小视频| 久久综合中文| 亚洲激情视频在线播放| 欧美va亚洲va日韩∨a综合色| 欧美在线看片a免费观看| 国产精品国产三级国产普通话蜜臀| 日韩视频在线一区| 一本色道久久综合亚洲精品不| 欧美大尺度在线| 亚洲视频免费在线| 亚洲专区免费| 在线精品国产欧美| 欧美激情a∨在线视频播放| 另类欧美日韩国产在线| 日韩视频永久免费| 亚洲综合成人婷婷小说| 黄色一区二区三区四区| 欧美激情一区二区| 欧美视频二区36p| 久久天堂成人| 欧美日韩精品二区| 久久亚洲私人国产精品va| 欧美丰满高潮xxxx喷水动漫| 性感少妇一区| 欧美日韩18| 欧美成人综合一区| 国产午夜精品一区二区三区欧美| 六月婷婷久久| 国产亚洲免费的视频看| 亚洲精品中文字幕有码专区| 国产在线精品自拍| 亚洲色无码播放| 一本色道久久综合| 欧美.com| 欧美高清在线观看| 精品999日本| 久久久久久久精| 久久午夜精品一区二区| 国产精品入口福利| 亚洲一区精品电影| 午夜一区二区三区不卡视频| 欧美日韩精品一本二本三本| 久久xxxx精品视频| 在线观看国产成人av片| 久久成人综合网|