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

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

?? ping.cpp

?? VC實現PING的各個參數,是學習SOCKET編程的 不錯參考程序,代碼清晰,可讀性好
?? CPP
字號:
/*
Module : PING.CPP
Purpose: Implementation for an MFC wrapper class to encapsulate PING
Created: PJN / 10-06-1998
History: PJN / 23-06-1198 1) Now code can be compiled to use Winsock2 calls
                          instead of using the ICMP.DLL. This gives another of
                          advantages:

                          i)  Your using a API that MS has promised to continue to support.
                          ii) Internally the class calls QueryPerformanceCounter meaning that
                              you will get the highest resolution RTT's possible.

                          2) Also did a general tidy up of the code
                          3) Changed default timeout to 1 second
         PJN / 30-07-1998 1) Can now use both Winsock 2 calls and ICMP style
				                     calls at the same time with the use of 2 preprocessor directives
                          2) sample program now use generic entry point _tmain 
													3) Got rid of a 2 level 4 compiler warning
													4) Fixed a problem with the cleanup of ICMP dll usage
													5) Tidied up and optimized the usage of static variables



Copyright (c) 1998 by PJ Naughter.  
All rights reserved.

*/


/////////////////////////////////  Includes  //////////////////////////////////
#include "stdafx.h"
#include "ping.h"


/////////////////////////////////  Definitions ////////////////////////////////

#define MIN_ICMP_PACKET_SIZE 8    //minimum 8 byte icmp packet (just header)
#define MAX_ICMP_PACKET_SIZE 1024 //Maximum icmp packet size

#ifdef CPING_USE_WINSOCK2

#ifndef _WINSOCK2API_
#pragma message("You need to include winsock2.h in your PCH")
#endif

// IP header
typedef struct tagIP_HEADER 
{
	unsigned int h_len:4;          // length of the header
	unsigned int version:4;        // Version of IP
	unsigned char tos;             // Type of service
	unsigned short total_len;      // total length of the packet
	unsigned short ident;          // unique identifier
	unsigned short frag_and_flags; // flags
	unsigned char  ttl; 
	unsigned char proto;           // protocol (TCP, UDP etc)
	unsigned short checksum;       // IP checksum
	unsigned int sourceIP;
	unsigned int destIP;
} IP_HEADER;
typedef IP_HEADER FAR* LPIP_HEADER;

// ICMP header
typedef struct tagICMP_HEADER 
{
  BYTE i_type;
  BYTE i_code; /* type sub code */
  USHORT i_cksum;
  USHORT i_id;
  USHORT i_seq;
  /* This is not the std header, but we reserve space for time */
  ULONG timestamp;
} ICMP_HEADER;
typedef ICMP_HEADER FAR* LPICMP_HEADER;

void FillIcmpData(LPICMP_HEADER pIcmp, int nData);
BOOL DecodeResponse(char* pBuf, int nBytes, sockaddr_in* from);
USHORT GenerateIPChecksum(USHORT* pBuffer, int nSize);

#endif //CPING_USE_WINSOCK2




/////////////////////////////////  Macros & Statics ///////////////////////////

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

#ifdef CPING_USE_WINSOCK2
BOOL CPing::sm_bWinsock2OK = FALSE;
BOOL CPing::sm_bAttemptedWinsock2Initialise = FALSE;
#endif 

#ifdef CPING_USE_ICMP
BOOL CPing::sm_bAttemptedIcmpInitialise = FALSE;
lpIcmpCreateFile CPing::sm_pIcmpCreateFile = NULL;
lpIcmpSendEcho CPing::sm_pIcmpSendEcho = NULL;
lpIcmpCloseHandle CPing::sm_pIcmpCloseHandle = NULL;
#endif

__int64 CPing::sm_TimerFrequency = 0;


//Internal class which is used to ensure that the ICMP
//handle and winsock stack is closed upon exit 
class _CPING
{
public:
  _CPING();
	~_CPING();
protected:
#ifdef CPING_USE_ICMP
  HINSTANCE sm_hIcmp;
#endif

	friend class CPing;
};

_CPING::_CPING()
{
#ifdef CPING_USE_ICMP
  sm_hIcmp = NULL;
#endif
}

_CPING::~_CPING()
{
#ifdef CPING_USE_ICMP
	if (sm_hIcmp)
	{
		FreeLibrary(sm_hIcmp);
		sm_hIcmp = NULL;
  }
#endif
	WSACleanup();
}

static _CPING _cpingData;




///////////////////////////////// Implementation //////////////////////////////

#ifdef CPING_USE_WINSOCK2
BOOL CPing::Initialise2() const
{
	if (!sm_bAttemptedWinsock2Initialise)
	{
		sm_bAttemptedWinsock2Initialise = TRUE;

		//Initialise the winsock 2 stack
		WSADATA wsa;
		sm_bWinsock2OK = (WSAStartup(MAKEWORD(2, 1), &wsa) == 0);

    //Use the High performace counter to get an accurate RTT
    LARGE_INTEGER Frequency;
		Frequency.QuadPart = 0;
    sm_bWinsock2OK = sm_bWinsock2OK && QueryPerformanceFrequency(&Frequency);
    if (sm_bWinsock2OK)
      sm_TimerFrequency = Frequency.QuadPart;
	}

	return sm_bWinsock2OK;
}
#endif //CPING_USE_WINSOCK2

#ifdef CPING_USE_ICMP
BOOL CPing::Initialise1() const
{
	if (!sm_bAttemptedIcmpInitialise)
	{
		sm_bAttemptedIcmpInitialise = TRUE;

		//Initialise the winsock stack
		WSADATA wsa;
		if (WSAStartup(MAKEWORD(1, 1), &wsa) != 0)
		{
			TRACE(_T("Could not negotiate a correct version of WinSock\n"));
			return FALSE;
		}

		//Load up the ICMP library
		_cpingData.sm_hIcmp = LoadLibrary(_T("ICMP.DLL"));
		if (_cpingData.sm_hIcmp == NULL)
		{
			TRACE(_T("Could not load up the ICMP DLL\n"));
			return FALSE;
		}

		//Retrieve pointers to the functions in the ICMP dll
		sm_pIcmpCreateFile = (lpIcmpCreateFile) GetProcAddress(_cpingData.sm_hIcmp,"IcmpCreateFile");
		sm_pIcmpSendEcho = (lpIcmpSendEcho) GetProcAddress(_cpingData.sm_hIcmp,"IcmpSendEcho" );
		sm_pIcmpCloseHandle = (lpIcmpCloseHandle) GetProcAddress(_cpingData.sm_hIcmp,"IcmpCloseHandle");

		if (sm_pIcmpCreateFile == NULL || sm_pIcmpSendEcho == NULL ||	sm_pIcmpCloseHandle == NULL)
		  TRACE(_T("Could not find ICMP functions in the ICMP DLL\n"));
	}

	return (sm_pIcmpCreateFile != NULL && sm_pIcmpSendEcho != NULL &&	sm_pIcmpCloseHandle != NULL);
}
#endif //CPING_USE_ICMP

#ifdef CPING_USE_WINSOCK2
BOOL CPing::Ping2(LPCTSTR pszHostName, CPingReply& pr, UCHAR /*nTTL*/, DWORD dwTimeout, UCHAR nPacketSize) const
{
  //Parameter validation
  if (nPacketSize > MAX_ICMP_PACKET_SIZE || nPacketSize < MIN_ICMP_PACKET_SIZE)
  {
    ASSERT(FALSE);
    SetLastError(WSAENOBUFS);
    return FALSE;
  }

	//For correct operation of the T2A macro, see TN059
	USES_CONVERSION;

	//Make sure everything is initialised
	if (!Initialise2())
	  return FALSE;

  //Resolve the address of the host to connect to
  sockaddr_in dest;
  memset(&dest,0,sizeof(dest));
	LPSTR lpszAscii = T2A((LPTSTR) pszHostName);
  unsigned long addr = inet_addr(lpszAscii);
	if (addr == INADDR_NONE)
	{
		//Not a dotted address, then do a lookup of the name
		hostent* hp = gethostbyname(lpszAscii);
		if (hp)
    {
      memcpy(&(dest.sin_addr),hp->h_addr,hp->h_length);
  	  dest.sin_family = hp->h_addrtype;
    }
    else
	  {
		  TRACE(_T("CPing::Ping2, Could not resolve the host name %s\n"), pszHostName);
		  return FALSE;
    }
  }
  else
  {
    dest.sin_addr.s_addr = addr;
    dest.sin_family = AF_INET;
  }

  //Create the raw socket
  SOCKET sockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, 0);
  if (sockRaw == INVALID_SOCKET) 
	{
	  TRACE(_T("CPing::Ping2, Failed to create a raw socket\n"));
	  return FALSE;
  }

  //Allocate the ICMP packet
  int nBufSize = nPacketSize + sizeof(ICMP_HEADER);
  char* pICMP = new char[nBufSize];
  FillIcmpData((LPICMP_HEADER) pICMP, nBufSize);

  //Get the tick count prior to sending the packet
  LARGE_INTEGER TimerTick;
  VERIFY(QueryPerformanceCounter(&TimerTick));
  __int64 nStartTick = TimerTick.QuadPart;

  //Send of the packet
	int nWrote = sendto(sockRaw, pICMP, nBufSize, 0, (sockaddr*)&dest, sizeof(dest));
	if (nWrote == SOCKET_ERROR)
	{
		TRACE(_T("CPing::Ping2, sendto failed\n"));

    delete [] pICMP;

    DWORD dwError = GetLastError();
    closesocket(sockRaw);
    SetLastError(dwError);

    return FALSE;
	}

  //allocate the recv buffer
  char* pRecvBuf = new char[MAX_ICMP_PACKET_SIZE];
  BOOL bReadable;
  sockaddr_in from;
  int nFromlen = sizeof(from);
  int nRead = 0;

  //Allow the specified timeout
  if (IsSocketReadible(sockRaw, dwTimeout, bReadable))
  {
    if (bReadable)
    {
      //Receive the response
	    nRead = recvfrom(sockRaw, pRecvBuf, MAX_ICMP_PACKET_SIZE, 0, (sockaddr*)&from, &nFromlen);
    }
    else
    {
		  TRACE(_T("CPing::Ping2, timeout occured while awaiting recvfrom\n"));
      closesocket(sockRaw);

      delete [] pICMP;
      delete [] pRecvBuf;

      //set the error to timed out
      SetLastError(WSAETIMEDOUT);

		  return FALSE;
    }
  }
  else
  {
		TRACE(_T("CPing::Ping2, IsReadible call failed\n"));

    delete [] pICMP;
    delete [] pRecvBuf;

    DWORD dwError = GetLastError();
    closesocket(sockRaw);
    SetLastError(dwError);

		return FALSE;
  }

  //Get the current tick count
  VERIFY(QueryPerformanceCounter(&TimerTick));

  //Now check the return response from recvfrom
	if (nRead == SOCKET_ERROR)
	{
		TRACE(_T("CPing::Ping2, recvfrom call failed\n"));

    delete [] pICMP;
    delete [] pRecvBuf;

    DWORD dwError = GetLastError();
    closesocket(sockRaw);
    SetLastError(dwError);

		return FALSE;
	}

  //Decode the response we got back
 	BOOL bSuccess = DecodeResponse(pRecvBuf, nRead, &from);

  //If we successfully decoded the response, then return the
  //values in the CPingReply instance
  if (bSuccess)
  {
    pr.Address = from.sin_addr;
    pr.RTT = (ULONG) ((TimerTick.QuadPart - nStartTick) * 1000 / sm_TimerFrequency);
  }

  //Don't forget to release out socket
  closesocket(sockRaw);

  //Free up the memory we allocated
  delete [] pICMP;
  delete [] pRecvBuf;

  //return the status
	return bSuccess;
}
#endif //CPING_USE_WINSOCK2

BOOL CPing::IsSocketReadible(SOCKET socket, DWORD dwTimeout, BOOL& bReadible)
{
  timeval timeout = {dwTimeout/1000, dwTimeout % 1000};
  fd_set fds;
  FD_ZERO(&fds);
  FD_SET(socket, &fds);
  int nStatus = select(0, &fds, NULL, NULL, &timeout);
  if (nStatus == SOCKET_ERROR)
  {
    return FALSE;
  }
  else
  {
    bReadible = !(nStatus == 0);
    return TRUE;
  }
}

#ifdef CPING_USE_ICMP
BOOL CPing::Ping1(LPCTSTR pszHostName, CPingReply& pr, UCHAR nTTL, DWORD dwTimeout, UCHAR nPacketSize) const
{
	//For correct operation of the T2A macro, see TN059
	USES_CONVERSION;

	//Make sure everything is initialised
	if (!Initialise1())
	  return FALSE;

  ASSERT(_cpingData.sm_hIcmp); //ICMP dll must be open

	LPSTR lpszAscii = T2A((LPTSTR) pszHostName);
	//Convert from dotted notation if required
	unsigned long	addr = inet_addr(lpszAscii);
	if (addr == INADDR_NONE)
	{
		//Not a dotted address, then do a lookup of the name
		hostent* hp = gethostbyname(lpszAscii);
		if (hp)
			memcpy(&addr, hp->h_addr, hp->h_length);
		else
		{
			TRACE(_T("Could not resolve the host name %s\n"), pszHostName);
			return FALSE;
		}
	}

  //Create the ICMP handle
	HANDLE hIP = sm_pIcmpCreateFile();
	if (hIP == INVALID_HANDLE_VALUE)
	{
		TRACE(_T("Could not get a valid ICMP handle\n"));
		return FALSE;
	}

  //Set up the option info structure
	IP_OPTION_INFORMATION OptionInfo;
	ZeroMemory(&OptionInfo, sizeof(IP_OPTION_INFORMATION));
	OptionInfo.Ttl = nTTL;

  //Set up the data which will be sent
  unsigned char* pBuf = new unsigned char[nPacketSize];
  memset(pBuf, 'E', nPacketSize);

	//Do the actual Ping
  int nReplySize = sizeof(ICMP_ECHO_REPLY) + max(MIN_ICMP_PACKET_SIZE, nPacketSize);
  unsigned char* pReply = new unsigned char[nReplySize];
	ICMP_ECHO_REPLY* pEchoReply = (ICMP_ECHO_REPLY*) pReply;
  DWORD nRecvPackets = sm_pIcmpSendEcho(hIP, addr, pBuf, nPacketSize, &OptionInfo, pReply, nReplySize, dwTimeout);

  //Check we got the packet back
  BOOL bSuccess = (nRecvPackets == 1);

  //Check the IP status is OK (O is IP Success)
  if (bSuccess && (pEchoReply->Status != 0))
  {
    bSuccess = FALSE;
    SetLastError(pEchoReply->Status);
  }

  //Check we got the same amount of data back as we sent
  if (bSuccess)
  {
    bSuccess = (pEchoReply->DataSize == nPacketSize);
    if (!bSuccess)
      SetLastError(ERROR_UNEXP_NET_ERR);
  }

  //Check the data we got back is what was sent
  if (bSuccess)
  {
    char* pReplyData = (char*) pEchoReply->Data;
    for (int i=0; i<nPacketSize && bSuccess; i++)
      bSuccess = (pReplyData[i] == 'E');

    if (!bSuccess)
      SetLastError(ERROR_UNEXP_NET_ERR);
  }

  //Close the ICMP handle
	sm_pIcmpCloseHandle(hIP);

	if (bSuccess)
	{
    //Ping was successful, copy over the pertinent info
    //into the return structure
		pr.Address.S_un.S_addr = pEchoReply->Address;
	  pr.RTT = pEchoReply->RoundTripTime;
	}

  //Free up the memory we allocated
  delete [] pBuf;
  delete [] pReply;

  //return the status
	return bSuccess; 
}
#endif //CPING_USE_ICMP


#ifdef CPING_USE_WINSOCK2
//Decode the raw Ip packet we get back
BOOL DecodeResponse(char* pBuf, int nBytes, sockaddr_in* from) 
{
  //Get the current tick count
  LARGE_INTEGER TimerTick;
  VERIFY(QueryPerformanceCounter(&TimerTick));


	LPIP_HEADER pIpHdr = (LPIP_HEADER) pBuf;
	int nIpHdrlen = pIpHdr->h_len * 4; //Number of 32-bit words*4 = bytes

  //Not enough data recieved
	if (nBytes < nIpHdrlen + MIN_ICMP_PACKET_SIZE) 
	{
		TRACE(_T("Received too few bytes from %s\n"), inet_ntoa(from->sin_addr));
    SetLastError(ERROR_UNEXP_NET_ERR);
    return FALSE;
	}

  //Check it is an ICMP_ECHOREPLY packet
	LPICMP_HEADER pIcmpHdr = (LPICMP_HEADER) (pBuf + nIpHdrlen);
	if (pIcmpHdr->i_type != 0) //type ICMP_ECHOREPLY is 0
	{
		TRACE(_T("non-echo type %d recvd\n"), pIcmpHdr->i_type);
    SetLastError(ERROR_UNEXP_NET_ERR);
		return FALSE;
	}

  //Check it is the same id as we sent
	if (pIcmpHdr->i_id != (USHORT)GetCurrentProcessId()) 
	{
		TRACE(_T("Received someone else's packet!\n"));
    SetLastError(ERROR_UNEXP_NET_ERR);
		return FALSE;
	}

  return TRUE;
}

//generate an IP checksum based on a given data buffer
USHORT GenerateIPChecksum(USHORT* pBuffer, int nSize) 
{
  unsigned long cksum = 0;

  while (nSize > 1) 
	{
	  cksum += *pBuffer++;
	  nSize -= sizeof(USHORT);
  }
  
  if (nSize) 
	  cksum += *(UCHAR*)pBuffer;

  cksum = (cksum >> 16) + (cksum & 0xffff);
  cksum += (cksum >>16);
  return (USHORT)(~cksum);
}

//Fill up the ICMP packet with defined values
void FillIcmpData(LPICMP_HEADER pIcmp, int nData)
{
  pIcmp->i_type    = 8; //ICMP_ECHO type
  pIcmp->i_code    = 0;
  pIcmp->i_id      = (USHORT) GetCurrentProcessId();
  pIcmp->i_seq     = 0;
  pIcmp->i_cksum   = 0;
  pIcmp->timestamp = GetTickCount();
 
  //Set up the data which will be sent
  int nHdrSize = sizeof(ICMP_HEADER);
  char* pData = (char*) (pIcmp + nHdrSize);
  memset(pData, 'E', nData - nHdrSize);

  //Generate the checksum
  pIcmp->i_cksum = GenerateIPChecksum((USHORT*)pIcmp, nData);
}
#endif //CPING_USE_WINSOCK2

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃av一区二区在线观看| 色综合一区二区三区| 99久久国产综合精品麻豆| 欧美日韩国产高清一区二区三区 | 久久激情综合网| www.激情成人| 久久综合精品国产一区二区三区| 一区二区三区四区亚洲| 高清在线不卡av| 欧美一区二区大片| 一二三区精品福利视频| 福利一区二区在线| 欧美成人精品1314www| 亚洲国产wwwccc36天堂| av激情成人网| 国产精品美女久久久久久| 久国产精品韩国三级视频| 欧美视频在线播放| 伊人婷婷欧美激情| 91在线视频官网| 国产精品的网站| 国产a视频精品免费观看| 精品美女在线观看| 麻豆精品国产传媒mv男同| 欧美日韩一级视频| 性感美女久久精品| 欧美日韩国产一级二级| 亚洲国产精品影院| 欧美色图第一页| 香蕉久久一区二区不卡无毒影院| 欧美在线观看一二区| 亚洲免费色视频| 在线视频欧美区| 亚洲综合色婷婷| 欧美日韩国产一区二区三区地区| 亚洲妇熟xx妇色黄| 91麻豆精品国产自产在线观看一区 | 欧美日韩在线播放一区| 亚洲欧洲成人自拍| 一本一道波多野结衣一区二区| 精品国产免费一区二区三区香蕉 | 一区二区成人在线| 欧美色倩网站大全免费| 日韩高清在线电影| 亚洲精品一区二区在线观看| 国产精品69毛片高清亚洲| 国产片一区二区| 色综合久久中文字幕综合网| 亚洲综合免费观看高清完整版| 欧美这里有精品| 日日夜夜精品视频天天综合网| 欧美一区二区三区在线观看 | 国产精品夜夜爽| 国产精品视频观看| 色综合久久99| 另类综合日韩欧美亚洲| 亚洲国产精品av| 欧美亚洲综合在线| 久久97超碰国产精品超碰| 亚洲国产精品黑人久久久| 91成人在线免费观看| 免费在线一区观看| 中文字幕在线免费不卡| 欧美日韩美少妇 | 肉肉av福利一精品导航| 2021久久国产精品不只是精品| 成人精品gif动图一区| 亚洲超碰97人人做人人爱| 国产亚洲人成网站| 欧美影视一区二区三区| 国产一区二区免费在线| 亚洲主播在线播放| 国产亚洲短视频| 91精品婷婷国产综合久久| 成人涩涩免费视频| 美女视频黄久久| 亚洲欧美偷拍三级| 国产夜色精品一区二区av| 欧美色图片你懂的| 成人动漫av在线| 免费看欧美美女黄的网站| 成人欧美一区二区三区在线播放| 日韩一区二区三| 在线亚洲免费视频| 成人视屏免费看| 黑人精品欧美一区二区蜜桃| 一区二区三区久久| 国产精品热久久久久夜色精品三区| 欧美午夜片在线看| 99国产精品国产精品毛片| 韩国成人福利片在线播放| 偷拍日韩校园综合在线| 亚洲欧美二区三区| 国产精品美女久久久久aⅴ国产馆| 欧美高清视频一二三区 | 亚洲国产成人精品视频| 国产精品美女久久久久久| 精品成a人在线观看| 欧美浪妇xxxx高跟鞋交| 在线观看视频欧美| 99视频一区二区| 成人免费高清视频| 国产99精品国产| 国产福利一区二区三区视频| 精品一区二区三区香蕉蜜桃| 日韩av午夜在线观看| 亚洲高清在线视频| 亚洲国产一区二区视频| 夜夜操天天操亚洲| 一区二区三区日韩欧美| 亚洲精品国产一区二区精华液 | 国产一区二区三区久久悠悠色av| 日韩在线卡一卡二| 日韩va亚洲va欧美va久久| 三级不卡在线观看| 蜜桃av噜噜一区二区三区小说| 午夜影视日本亚洲欧洲精品| 三级不卡在线观看| 狂野欧美性猛交blacked| 精品一区二区三区在线播放视频| 久久99久久精品| 国产综合久久久久久久久久久久| 黄色小说综合网站| 成人中文字幕电影| 92国产精品观看| 欧美日韩一区二区在线观看| 在线观看亚洲一区| 欧美精品 日韩| 欧美精品一区二区在线观看| 国产亚洲精品久| 综合欧美亚洲日本| 亚洲国产精品天堂| 男人操女人的视频在线观看欧美| 久久69国产一区二区蜜臀| 国产成人三级在线观看| 91免费视频网址| 欧美军同video69gay| 精品久久久久99| 亚洲欧美综合在线精品| 亚洲国产美国国产综合一区二区| 日韩国产一二三区| 岛国一区二区三区| 91高清在线观看| 欧美va亚洲va| 亚洲精品高清在线观看| 日本不卡一区二区三区高清视频| 国产精品1024| 欧美性猛交xxxx乱大交退制版| 日韩一区二区三区视频| 国产精品你懂的在线欣赏| 亚洲一区二区三区视频在线| 国产一区二三区好的| 色噜噜偷拍精品综合在线| 日韩情涩欧美日韩视频| 亚洲人成亚洲人成在线观看图片| 91视视频在线观看入口直接观看www | eeuss鲁片一区二区三区在线看 | 久久国产尿小便嘘嘘| 成人动漫一区二区在线| 欧美日韩高清影院| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲精品免费看| 国产黄色成人av| 制服丝袜成人动漫| 亚洲欧洲精品一区二区三区不卡| 老色鬼精品视频在线观看播放| 99热这里都是精品| 久久久www成人免费毛片麻豆| 亚洲一区二区成人在线观看| 国产91在线看| 日韩欧美国产一区二区三区| 一区二区三区中文字幕| 国产suv精品一区二区883| 欧美成人aa大片| 偷拍一区二区三区四区| 色综合天天狠狠| 日本一区二区视频在线观看| 狠狠色丁香婷婷综合| 在线成人av影院| 亚洲成人黄色影院| 91久久精品一区二区二区| 成人免费一区二区三区视频| 国产精品一区免费在线观看| 日韩欧美国产电影| 日韩黄色片在线观看| 欧美三区在线观看| 一区二区成人在线视频| 一本色道久久综合亚洲91| 中文字幕亚洲不卡| 成人丝袜18视频在线观看| 久久久精品免费观看| 国产一区二区精品久久| 久久久久久**毛片大全| 国产又黄又大久久| 久久精品亚洲乱码伦伦中文 | 亚洲大型综合色站| 欧美性视频一区二区三区| 亚洲蜜臀av乱码久久精品| 日本精品一级二级| 亚洲欧美成人一区二区三区|