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

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

?? ftpserver.cpp

?? TinyFtpServer 網上的Ftp客戶端的工具很多
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// FtpServer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string.h>
#include <ws2tcpip.h>
#include <stdlib.h>

#define FTP_PORT        21     // FTP 控制端口
#define DATA_FTP_PORT   20     // FTP 數據端口
#define DATA_BUFSIZE    8192
#define MAX_NAME_LEN    128
#define MAX_PWD_LEN     128
#define MAX_RESP_LEN    1024
#define MAX_REQ_LEN     256
#define MAX_ADDR_LEN    80

#define WSA_RECV         0
#define WSA_SEND         1

#define USER_OK         331
#define LOGGED_IN       230
#define LOGIN_FAILED    530
#define CMD_OK          200
#define OPENING_AMODE   150
#define TRANS_COMPLETE  226
#define CANNOT_FIND     550
#define FTP_QUIT        221
#define CURR_DIR        257
#define DIR_CHANGED     250
#define OS_TYPE         215
#define REPLY_MARKER    504
#define PASSIVE_MODE    227

#define DEFAULT_USER		"tinyle"
#define DEFAULT_PASS		"751022"
#define DEFAULT_HOME_DIR    "C:\\TEMP"
#define DEFAULT_HOME_DIR_U  "/c:/temp"
#define MAX_FILE_NUM        1024

#define MODE_PORT       0
#define MODE_PASV       1

#define PORT_BIND   1821

typedef struct _SOCKET_INFO {
   CHAR   buffRecv[DATA_BUFSIZE];
   CHAR   buffSend[DATA_BUFSIZE];
   WSABUF wsaBuf;
   SOCKET s;
   WSAOVERLAPPED o;
   DWORD dwBytesSend;
   DWORD dwBytesRecv;
   int   nStatus;
} SOCKET_INFO, *LPSOCKET_INFO;

typedef struct _FILE_INFO {
	TCHAR    szFileName[MAX_PATH];
	DWORD    dwFileAttributes; 
    FILETIME ftCreationTime; 
    FILETIME ftLastAccessTime; 
    FILETIME ftLastWriteTime; 
    DWORD    nFileSizeHigh; 
    DWORD    nFileSizeLow; 
} FILE_INFO, *LPFILE_INFO;

DWORD WINAPI ProcessIO( LPVOID lpParam ) ;
BOOL  Welcome( SOCKET s );
int LoginSvr( LPSOCKET_INFO pSocketInfo  );
int SendResponse( LPSOCKET_INFO pSI );
int RecvRequest( LPSOCKET_INFO pSI );

int ParseCommand( LPSOCKET_INFO pSI );

DWORD g_dwEventTotal = 0;
DWORD g_index;
WSAEVENT g_events[WSA_MAXIMUM_WAIT_EVENTS];
LPSOCKET_INFO g_sockets[WSA_MAXIMUM_WAIT_EVENTS];
CRITICAL_SECTION g_cs;  
char  g_szLocalAddr[MAX_ADDR_LEN]; 

BOOL  g_bLoggedIn;
///////////////////////////////////////////////////////////////////////////////////////////
// Assistant function
char* GetLocalAddress()
{
    struct in_addr *pinAddr;
    LPHOSTENT	lpHostEnt;
	int			nRet;
	int			nLen;
	char        szLocalAddr[80];
	ZeroMemory( szLocalAddr,sizeof(szLocalAddr) );

	//
	// Get our local name
	//
    nRet = gethostname(szLocalAddr,sizeof(szLocalAddr) );
	if (nRet == SOCKET_ERROR) {
		return NULL;
	}

	//
	// "Lookup" the local name
	//
	lpHostEnt = gethostbyname(szLocalAddr);
    if (NULL == lpHostEnt)	{
		return NULL;
	}

	//
    // Format first address in the list
	//
	pinAddr = ((LPIN_ADDR)lpHostEnt->h_addr);
	nLen = strlen(inet_ntoa(*pinAddr));
	if ((DWORD)nLen > sizeof(szLocalAddr)) {
		WSASetLastError(WSAEINVAL);
		return NULL;
	}

	return inet_ntoa(*pinAddr);
}
int GetFileList( LPFILE_INFO pFI, UINT nArraySize, const char* szPath  )
{
	WIN32_FIND_DATA  wfd;
	int idx = 0;
	CHAR lpFileName[MAX_PATH];
	GetCurrentDirectory( MAX_PATH,lpFileName );
	strcat( lpFileName,"\\" );
	strcat( lpFileName, szPath );
	HANDLE hFile = FindFirstFile( lpFileName, &wfd );
	if ( hFile != INVALID_HANDLE_VALUE ) {
		pFI[idx].dwFileAttributes = wfd.dwFileAttributes;
		lstrcpy( pFI[idx].szFileName, wfd.cFileName );
		pFI[idx].ftCreationTime = wfd.ftCreationTime;
		pFI[idx].ftLastAccessTime = wfd.ftLastAccessTime;
		pFI[idx].ftLastWriteTime  = wfd.ftLastWriteTime;
		pFI[idx].nFileSizeHigh    = wfd.nFileSizeHigh;
		pFI[idx++].nFileSizeLow   = wfd.nFileSizeLow;
		while( FindNextFile( hFile,&wfd ) && idx < (int)nArraySize ) {
			pFI[idx].dwFileAttributes = wfd.dwFileAttributes;
			lstrcpy( pFI[idx].szFileName, wfd.cFileName );
			pFI[idx].ftCreationTime = wfd.ftCreationTime;
			pFI[idx].ftLastAccessTime = wfd.ftLastAccessTime;
			pFI[idx].ftLastWriteTime  = wfd.ftLastWriteTime;
			pFI[idx].nFileSizeHigh    = wfd.nFileSizeHigh;
			pFI[idx++].nFileSizeLow   = wfd.nFileSizeLow;
		}
		FindClose( hFile );
	}

	return idx;
}
char* Back2Slash( char* szPath ) 
{
	int idx = 0;
	if( NULL == szPath ) return NULL;
	strlwr( szPath );
	while( szPath[idx] ) { 
		if( szPath[idx] == '\\' )
			szPath[idx] = '/';
		idx ++;
	}
	return szPath;
}
char* Slash2Back( char* szPath )
{
	int idx = 0;
	if( NULL == szPath ) return NULL;
	strlwr( szPath );
	while( szPath[idx] ) { 
		if( '/' = szPath[idx]  )
			szPath[idx] = '\\';
		idx ++;
	}
	return szPath;
}
char* RelativeDirectory( char* szDir )
{
	int nStrLen = strlen(DEFAULT_HOME_DIR);
	if( !strnicmp( szDir,DEFAULT_HOME_DIR, nStrLen ) ) 
		szDir += nStrLen;

	if( szDir && szDir[0] == '\0' ) szDir = "/";
	
	return Back2Slash(szDir);
}
char* AbsoluteDirectory( char* szDir )
{
	char szTemp[MAX_PATH];
	strcpy( szTemp,DEFAULT_HOME_DIR+2 );
	if( NULL == szDir ) return NULL;
	if( '/' == szDir[0] )
		strcat( szTemp, szDir );
	szDir = szTemp ;
	
	return Slash2Back(szDir);
}
///////////////////////////////////////////////////////////////////////////////////////////
// start main function
void main(void)
{
   WSADATA wsaData;
   SOCKET sListen, sAccept;
   SOCKADDR_IN inetAddr;
   DWORD dwFlags;
   DWORD dwThreadId;
   DWORD dwRecvBytes;
   INT   nRet;

   InitializeCriticalSection(&g_cs);

   if (( nRet = WSAStartup(0x0202,&wsaData)) != 0 ) {
      printf("WSAStartup failed with error %d\n", nRet);
      return;
   }

   // 先取得本地地址
   sprintf( g_szLocalAddr,"%s",GetLocalAddress() );

   if ((sListen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, 
      WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) 
   {
      printf("Failed to get a socket %d\n", WSAGetLastError());
	  WSACleanup();
      return;
   }

   inetAddr.sin_family = AF_INET;
   inetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
   inetAddr.sin_port = htons(FTP_PORT);

   if (bind(sListen, (PSOCKADDR) &inetAddr, sizeof(inetAddr)) == SOCKET_ERROR)
   {
      printf("bind() failed with error %d\n", WSAGetLastError());
      return;
   }

   if (listen(sListen, SOMAXCONN))
   {
      printf("listen() failed with error %d\n", WSAGetLastError());
      return;
   }

   // Setup the listening socket for connections.

   if ((sAccept = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,
      WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) 
   {
      printf("Failed to get a socket %d\n", WSAGetLastError());
      return;
   }

   // Create a manual reset object with an initial state of 
   // nonsignaled
   if ((g_events[0] = WSACreateEvent()) == WSA_INVALID_EVENT)
   {
      printf("WSACreateEvent failed with error %d\n", WSAGetLastError());
      return;
   }

   // Create a thread to service overlapped requests
   if (CreateThread(NULL, 0, ProcessIO, NULL, 0, &dwThreadId) == NULL)
   {
      printf("CreateThread failed with error %d\n", GetLastError());
      return;
   } 

   g_dwEventTotal = 1;

   while(TRUE)
   {
       // Accept inbound connections

      if ((sAccept = accept(sListen, NULL, NULL)) == INVALID_SOCKET)
      {
          printf("accept failed with error %d\n", WSAGetLastError());
          return;
      }

	  if( !Welcome( sAccept ) ) break;
	  if( !SetCurrentDirectory( DEFAULT_HOME_DIR ) ) break;

      EnterCriticalSection(&g_cs);

      // Create a socket information structure to associate with the accepted socket.

      if ((g_sockets[g_dwEventTotal] = (LPSOCKET_INFO) GlobalAlloc(GPTR,
         sizeof(SOCKET_INFO))) == NULL)
      {
         printf("GlobalAlloc() failed with error %d\n", GetLastError());
         return;
      } 

      // Fill in the details of our accepted socket.
	  char buff[DATA_BUFSIZE]; ZeroMemory( buff,DATA_BUFSIZE );
	  g_sockets[g_dwEventTotal]->wsaBuf.buf = buff;  
	  g_sockets[g_dwEventTotal]->wsaBuf.len = DATA_BUFSIZE;
      g_sockets[g_dwEventTotal]->s = sAccept;
      ZeroMemory(&(g_sockets[g_dwEventTotal]->o), sizeof(OVERLAPPED));
      g_sockets[g_dwEventTotal]->dwBytesSend = 0;
      g_sockets[g_dwEventTotal]->dwBytesRecv = 0;
	  g_sockets[g_dwEventTotal]->nStatus     = WSA_RECV;    // 接收
     
     
      if ((g_sockets[g_dwEventTotal]->o.hEvent = g_events[g_dwEventTotal] = 
          WSACreateEvent()) == WSA_INVALID_EVENT)
      {
         printf("WSACreateEvent() failed with error %d\n", WSAGetLastError());
         return;
      }

      // Post a WSARecv request to to begin receiving data on the socket

      dwFlags = 0;
      if (WSARecv(g_sockets[g_dwEventTotal]->s, 
         &(g_sockets[g_dwEventTotal]->wsaBuf), 1, &dwRecvBytes, &dwFlags,
         &(g_sockets[g_dwEventTotal]->o), NULL) == SOCKET_ERROR)
      {
         if (WSAGetLastError() != ERROR_IO_PENDING)
         {
            printf("WSARecv() failed with error %d\n", WSAGetLastError());
            return;
         }
      }

      g_dwEventTotal++;

      LeaveCriticalSection(&g_cs);

      //
      // Signal the first event in the event array to tell the worker thread to
      // service an additional event in the event array
      //
      if (WSASetEvent(g_events[0]) == FALSE)
      {
         printf("WSASetEvent failed with error %d\n", WSAGetLastError());
         return;
      }
   }
}


DWORD WINAPI ProcessIO(LPVOID lpParameter)
{
   
   DWORD dwFlags;
   LPSOCKET_INFO pSI;
   DWORD dwBytesTransferred;
   DWORD i;
  
   // Process asynchronous WSASend, WSARecv requests.

   while(TRUE)
   {
      if ((g_index = WSAWaitForMultipleEvents(g_dwEventTotal, g_events, FALSE,
         WSA_INFINITE, FALSE)) == WSA_WAIT_FAILED)
      {
         printf("WSAWaitForMultipleEvents failed %d\n", WSAGetLastError());
         return 0;
      } 

      // If the event triggered was zero then a connection attempt was made
      // on our listening socket.
 
      if ((g_index - WSA_WAIT_EVENT_0) == 0)
      {
         WSAResetEvent(g_events[0]);
         continue;
      }

      pSI = g_sockets[g_index - WSA_WAIT_EVENT_0];
      WSAResetEvent(g_events[g_index - WSA_WAIT_EVENT_0]);

      if (WSAGetOverlappedResult(pSI->s, &(pSI->o), &dwBytesTransferred,
         FALSE, &dwFlags) == FALSE || dwBytesTransferred == 0)
      {
         printf("Closing socket %d\n", pSI->s);

         if (closesocket(pSI->s) == SOCKET_ERROR)
         {
            printf("closesocket() failed with error %d\n", WSAGetLastError());
         }

         GlobalFree(pSI);
         WSACloseEvent(g_events[g_index - WSA_WAIT_EVENT_0]);

         // Cleanup g_sockets and g_events by removing the socket event handle
         // and socket information structure if they are not at the end of the
         // arrays.

         EnterCriticalSection(&g_cs);

         if ((g_index - WSA_WAIT_EVENT_0) + 1 != g_dwEventTotal)
            for (i = g_index - WSA_WAIT_EVENT_0; i < g_dwEventTotal; i++) {
               g_events[i] = g_events[i + 1];
			   g_sockets[i] = g_sockets[i + 1];
            }

         g_dwEventTotal--;

         LeaveCriticalSection(&g_cs);

         continue;
      }
	  //
	  // 已經有數據傳遞
	  //
	  if( pSI->nStatus == WSA_RECV ) {
		  memcpy( &pSI->buffRecv[pSI->dwBytesRecv],pSI->wsaBuf.buf,dwBytesTransferred);
		  pSI->dwBytesRecv += dwBytesTransferred;
		  printf( "RECV:%s\n",pSI->buffRecv);
		  if( pSI->buffRecv[pSI->dwBytesRecv-2] == '\r'      // 要保證最后是\r\n
				&& pSI->buffRecv[pSI->dwBytesRecv-1] == '\n' 
				&& pSI->dwBytesRecv > 2 )  {                 
		
			 if( !g_bLoggedIn ) {
				if( LoginSvr(pSI) == LOGGED_IN )
					g_bLoggedIn = TRUE;
			 } else {
				  ParseCommand( pSI );
			 }
			 // 初始化緩沖區內容
			 ZeroMemory( pSI->buffRecv,sizeof(pSI->buffRecv) );
			 pSI->dwBytesRecv = 0;
		  }
	  } else {
		  pSI->dwBytesSend += dwBytesTransferred;
	  }
	  //
 	  // 繼續接收以后到來的數據
	  //
	  if( RecvRequest( pSI ) == -1 ) 
		  return -1; 
   }
   return 0;
}
// 由于只是簡單的出現一個登錄信息,直接用send就可以了
// 不必用WSASend來進行I/O Overlapped處理

int SendResponse( LPSOCKET_INFO pSI )
{
	// Post WSASend() request.
    // Since WSASend() is not gauranteed to send all of the bytes requested,
    // continue posting WSASend() calls until all received bytes are sent.

	static DWORD dwSendBytes = 0;

	pSI->nStatus = WSA_SEND;
    
    ZeroMemory(&(pSI->o), sizeof(WSAOVERLAPPED));
    pSI->o.hEvent = g_events[g_index - WSA_WAIT_EVENT_0];

    pSI->wsaBuf.buf = pSI->buffSend + pSI->dwBytesSend;
    pSI->wsaBuf.len = strlen( pSI->buffSend ) - pSI->dwBytesSend;

    if (WSASend(pSI->s, &(pSI->wsaBuf), 1, &dwSendBytes, 0,
        &(pSI->o), NULL) == SOCKET_ERROR) {
        if (WSAGetLastError() != ERROR_IO_PENDING) {
			printf("WSASend() failed with error %d\n", WSAGetLastError());
			return -1;
        }
    }

	return 0;
}
int RecvRequest( LPSOCKET_INFO pSI )
{
	static DWORD dwRecvBytes = 0;
	
	pSI->nStatus = WSA_RECV;
	
	// Now that there are no more bytes to send post another WSARecv() request.
	DWORD dwFlags = 0;
	ZeroMemory(&(pSI->o), sizeof(WSAOVERLAPPED));
	pSI->o.hEvent = g_events[g_index - WSA_WAIT_EVENT_0];

	pSI->wsaBuf.len = DATA_BUFSIZE;
//	pSI->wsaBuf.buf = pSI->buffRecv;

	if (WSARecv(pSI->s, &(pSI->wsaBuf), 1, &dwRecvBytes, &dwFlags,
		&(pSI->o), NULL) == SOCKET_ERROR) {
		if (WSAGetLastError() != ERROR_IO_PENDING) {
		   printf("WSARecv() failed with error %d\n", WSAGetLastError());
		   return -1;
		}
	}

	return 0;
}
//
// Print Welcome message 
//
BOOL Welcome( SOCKET s )
{
	char* szWelcome = "220 歡迎您登錄到tinyFtp Server...\r\n";
	if( send( s,szWelcome,strlen(szWelcome),0 ) == SOCKET_ERROR ) {
		printf("Ftp client error:%d\n", WSAGetLastError() );
		return FALSE;
	}
	// 因為剛進來,還沒連接,故
	g_bLoggedIn = FALSE;
	return TRUE;
}
int LoginSvr( LPSOCKET_INFO pSocketInfo  )
{
	const char* szUserOK = "331 User name okay, need password.\r\n"; 
	const char* szLoggedIn = "230 User logged in, proceed.\r\n";

	int  nRetVal = 0;
	static char szUser[MAX_NAME_LEN], szPwd[MAX_PWD_LEN];
	LPSOCKET_INFO pSI = pSocketInfo;
	if( strstr(strupr(pSI->buffRecv),"USER") ) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99视频一区二区| 国产suv精品一区二区883| 欧美亚洲丝袜传媒另类| 亚洲一区免费观看| 欧美日韩久久久一区| 日韩av中文字幕一区二区三区| 正在播放一区二区| 国内一区二区在线| 中文字幕一区在线观看视频| 欧美在线一二三| 蜜桃传媒麻豆第一区在线观看| 久久午夜国产精品| 色欧美片视频在线观看在线视频| 亚洲国产成人精品视频| 欧美xxxxx牲另类人与| 高清国产一区二区| 亚洲一区在线看| 精品国产一区二区精华| a4yy欧美一区二区三区| 午夜精品久久久久久久久久久| 亚洲精品在线一区二区| 色一区在线观看| 韩日精品视频一区| 一个色综合网站| 精品久久久久久久人人人人传媒 | 久久精品日产第一区二区三区高清版| 国产精品99久久久久久久女警| 亚洲视频一区在线| 日韩欧美一卡二卡| 91日韩精品一区| 美女一区二区三区| 日韩理论片网站| 欧美一区二区二区| 色一情一伦一子一伦一区| 蜜臀久久久久久久| 一区二区视频免费在线观看| 精品国产一区二区三区四区四 | 成人avav在线| 日韩电影免费在线| 亚洲色图欧美在线| 精品精品国产高清a毛片牛牛| 色综合欧美在线视频区| 国产一区二区三区不卡在线观看| 亚洲综合视频在线观看| 中文字幕av资源一区| 日韩欧美国产麻豆| 欧美吞精做爰啪啪高潮| 99视频国产精品| 国产福利一区二区三区视频在线| 无码av免费一区二区三区试看| 国产精品久久久一区麻豆最新章节| 日韩视频不卡中文| 欧美日韩国产综合久久| 99久久免费国产| 成人一区二区三区视频| 久久精品国产一区二区| 婷婷开心激情综合| 亚洲一区二区在线免费看| 国产精品久久久久久妇女6080 | 国内外成人在线| 奇米综合一区二区三区精品视频| 亚洲一区二区三区四区在线| 亚洲欧美怡红院| 国产精品久久影院| 欧美国产日本视频| 国产日韩欧美综合在线| 欧美zozo另类异族| 精品国产乱码久久久久久老虎| 欧美一级xxx| 日韩精品一区二| 久久日一线二线三线suv| 99热精品国产| 国产.精品.日韩.另类.中文.在线.播放| 日韩精品三区四区| 婷婷夜色潮精品综合在线| 亚洲一级二级在线| 亚洲福利视频导航| 一区av在线播放| 亚洲国产精品一区二区尤物区| 亚洲网友自拍偷拍| 亚洲成人在线免费| 奇米四色…亚洲| 国内外成人在线视频| 国产jizzjizz一区二区| 成人久久18免费网站麻豆| 99久久精品情趣| 欧美伊人精品成人久久综合97| 欧美午夜免费电影| 91麻豆精品国产91久久久资源速度| 欧美一区二区三区日韩视频| 日韩三级在线观看| 久久久久国色av免费看影院| 亚洲国产精品av| 亚洲视频狠狠干| 偷偷要91色婷婷| 国产欧美日韩一区二区三区在线观看| 欧美一区2区视频在线观看| 欧美一级日韩不卡播放免费| 精品国产sm最大网站免费看| 中文字幕av在线一区二区三区| 亚洲天堂福利av| 五月天中文字幕一区二区| 精品一区二区久久久| 国产v综合v亚洲欧| 91麻豆福利精品推荐| 91麻豆精品国产91久久久久久| 337p日本欧洲亚洲大胆色噜噜| 中文一区二区在线观看| 亚洲午夜精品17c| 久久成人免费电影| 成人av在线网站| 欧美日韩极品在线观看一区| 国产午夜亚洲精品不卡| 亚洲一区二区三区中文字幕| 精品一区二区三区久久| 日本久久精品电影| 久久久久久久久久久黄色| 亚洲一区二区三区视频在线| 精品伊人久久久久7777人| 97超碰欧美中文字幕| 日韩精品影音先锋| 亚洲狠狠丁香婷婷综合久久久| 麻豆成人免费电影| 91小视频在线| 欧美精品一区二区三区久久久| 亚洲视频在线一区观看| 国产一区二区三区蝌蚪| 欧美日韩美少妇| 国产精品毛片久久久久久 | 亚洲精品成人在线| 久久成人免费网站| 欧美日韩日日摸| 18成人在线视频| 狠狠色狠狠色合久久伊人| 欧美丝袜丝交足nylons图片| 欧美国产在线观看| 久久99精品网久久| 欧美精品第一页| 一区二区三区四区蜜桃| 成人中文字幕合集| 日韩视频在线你懂得| 亚洲成人精品一区二区| 91尤物视频在线观看| 久久精品一区二区三区不卡牛牛| 五月天久久比比资源色| 欧美综合在线视频| 亚洲欧美国产77777| 成人妖精视频yjsp地址| 久久久精品国产免大香伊| 久久精品国产一区二区| 欧美一区二区精美| 婷婷久久综合九色综合绿巨人| 色婷婷精品大在线视频| 成人欧美一区二区三区1314| 国产高清不卡二三区| 久久午夜色播影院免费高清| 久久www免费人成看片高清| 日韩午夜在线观看| 日韩高清一区在线| 欧美精品在线观看一区二区| 亚洲成人av中文| 69堂亚洲精品首页| 五月激情六月综合| 欧美一区二区精品在线| 日本成人在线不卡视频| 欧美一区欧美二区| 蜜桃av一区二区三区| 欧美成人a∨高清免费观看| 蜜桃久久精品一区二区| 精品捆绑美女sm三区| 国产麻豆午夜三级精品| 久久久久久久久久看片| 成人美女在线观看| 亚洲色欲色欲www| 99国产欧美另类久久久精品| 亚洲丝袜精品丝袜在线| 欧美性一区二区| 日韩av成人高清| 久久婷婷综合激情| www.66久久| 亚洲午夜激情网页| 日韩三级中文字幕| 国产suv一区二区三区88区| 国产精品亲子伦对白| 色欧美片视频在线观看在线视频| 亚洲成人免费影院| 日韩精品一区二区在线观看| 国产精品99久| 亚洲精品国产精品乱码不99 | av不卡在线播放| 亚洲午夜日本在线观看| 日韩欧美一二区| 成人丝袜18视频在线观看| 一区二区三区蜜桃网| 欧美一级免费观看| 成人一区在线看| 天堂va蜜桃一区二区三区| 久久精品欧美日韩| 在线观看日产精品| 久久福利视频一区二区|