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

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

?? sgipcomm.cpp

?? 聯通的短信網關平臺。 sp 使用。 如果想自己用vc 開發短信業務
?? CPP
字號:
/*****************************
 ** FILE: SGIPComm.cpp   ****
 ** Auth: Liaomch         ****
 ** Date: 2003-06-19      ****
 ** Modify:               ****
 *****************************/
 
#include <netdb.h>
#include "SGIPComm.h"
#include "sgip.h"
#include "SGIPPkg.h"

extern unsigned int g_nSeqNo; //系列號
extern char g_cSrcID[11];//節點編號
extern char g_cClientIP[16];
extern int  g_iLocalPort;
extern char g_cServerIP[16];
extern int	 g_iSrvPort;
extern int	 g_iAcceptNum;
extern char g_cRUserName[16];
extern char g_cRUserPwd[16];
extern char g_cLUserName[16];
extern char g_cLUserPwd[16];
extern char g_cSpNum[21];
extern char g_cCorpID[7];
 
CSGIPComm::CSGIPComm()
{
	m_pkg = new CSGIPPkg();
	pthread_mutex_init(&m_Connect_mutex , NULL);
	pthread_mutex_init(&m_send_mutex , NULL);
	pthread_mutex_init(&m_recv_mutex , NULL);
}
 
CSGIPComm::~CSGIPComm()
{
	if (m_pkg != NULL)
		delete m_pkg;
}


int CSGIPComm::DoConnect(const char *pSrv=NULL, int nPort=8801, int nTimes = 3)
{
	pthread_mutex_lock(&m_Connect_mutex);
	int nSockfd = ConnectToSMC(pSrv, nPort, nTimes); 
	pthread_mutex_unlock(&m_Connect_mutex);

	if (nSockfd != END_FAILED)
		printf("DoConnect succeed!\n");
	
	return nSockfd;
}

int CSGIPComm::ConnectToSMC(const char *pSrv=NULL, int nPort=8801, int nTimes = 3)
 {
	int nSockfd = 0;
 	for (int i=0; i<nTimes; i++)
 	{
		if (pSrv != NULL)
		{
			if ((nSockfd = TcpConnect((char *)pSrv, nPort)) != END_FAILED)
				break;
		}
		else
		{
			if ((nSockfd = TcpConnect((char *)&g_cServerIP, g_iSrvPort)) != END_FAILED)
				break;		
		}
	}

	if (nSockfd == END_FAILED)
	{
		printf("TcpConnect error!\n");
		return nSockfd;
	}
	else
		printf("TcpConnect succeed!\n");

	
	//send login msg and recv the response;

	char cBuf[1024];
	memset(&cBuf, 0, sizeof(cBuf));

	SGIP_BIND_BODY stBind;
	int nBufLen = 0;
	m_pkg->DeComposePackage(SGIP_BIND, (SGIP_MSG_BODY &)stBind, (char *)cBuf, &nBufLen);
	if (nBufLen == 0)
		return END_FAILED;
	
	if ( SendToSMC(nSockfd, (const char *)&cBuf, m_pkg->GetMessageLen(SGIP_BIND)) )
	{
		memset(&cBuf, 0, sizeof(cBuf));
		int nRcvMsgLen = sizeof(cBuf);
		int nRet = -1;
		nRet = RecvFromSMC(nSockfd, (char *)&cBuf, &nRcvMsgLen, 60);
		if ((nRet == END_SUCCEED) && (nRcvMsgLen >= 4))
		{
			int nStatus = m_pkg->GetPackageResult((const char *)&cBuf);
			if ((nStatus == END_SUCCEED)&&(nRcvMsgLen > 4))
			{
				return nSockfd;
			}
			else
			{
				close(nSockfd);
				nSockfd = -1;
				return END_FAILED;
			}
		}
		else
			printf("recv error!\n");
	}
	else
		printf("Send bind mesg error!\n");

	//error!
	close(nSockfd);
	nSockfd = -1;
	return END_FAILED;
 } 
 
int CSGIPComm::DisConnect(int nSockfd)
 {
	if (nSockfd < 0)
		return END_FAILED;

	char cBuf[1024];
	memset(&cBuf, 0, sizeof(cBuf));

	m_pkg->NewPackage(SGIP_UNBIND, (char *)cBuf);

	if ( SendToSMC(nSockfd, (const char *)&cBuf, sizeof(SGIP_UNBIND_MSG)) )
	{
		memset(&cBuf, 0, sizeof(cBuf));
		int nRcvMsgLen = sizeof(cBuf);
		int nRet = -1;
		nRet = RecvFromSMC(nSockfd, (char *)&cBuf, &nRcvMsgLen, 30);
		if ((nRet == END_SUCCEED) && (nRcvMsgLen >= 4))
		{
			int nMsgType = m_pkg->GetPackageType((const char *)&cBuf);
			if ((nMsgType == (int)SGIP_UNBIND_RESP)&&(nRcvMsgLen > 4))
			{
				close(nSockfd);
				nSockfd = -1;
				return END_SUCCEED;
			}
		}
	}
	//error!
	close(nSockfd);
	nSockfd = -1;
	return END_FAILED;
 } 

bool CSGIPComm::SendToSMC(int nSockfd, const char *pBuf, int nLen)
 {
 	if (nSockfd <= 0)
 		return false;
 		
 	int nSendLen = 0;
	const char *p = pBuf;
	int nLeftLen = nLen;

	//pthread_mutex_lock(&m_send_mutex);
 	for (; nLeftLen > 0; nLeftLen -= nSendLen)
 	{
 		p += nSendLen;
 		nSendLen = write(nSockfd, (void *)p, nLeftLen);
 		if (nSendLen < 0)
 		{
 			if (errno == EINTR)
 				nSendLen = 0;
 			else
			{
				//pthread_mutex_unlock(&m_send_mutex);
 				return false;
			}
 		} 		
 	} 
	//pthread_mutex_unlock(&m_send_mutex);
	if (nLeftLen == 0)
 		return true;
	else 
		return false;
 }
 
int CSGIPComm::RecvFromSMC(int nSockfd, char *pBuf, int *pLen, int nTimeout)
{
	int        i_read = 0 ;
	int        i_len = 0;
	int			nBufLen = *pLen;

	*pLen = 0;

	if(nSockfd < 0)
	{    
		return END_FAILED ;
	}
	//pthread_mutex_lock(&m_recv_mutex);
    /*
    ** read file length 
    */
	i_read = tcp_recv(nSockfd, pBuf, 4, nTimeout);

    if ( i_read == -1 )
    {
		//pthread_mutex_unlock(&m_recv_mutex);
        return(END_FAILED);
    }

	//added by liaomch 2003-10-17
	//超時收到長度為0
    if ( i_read == 0)
    {
		//pthread_mutex_unlock(&m_recv_mutex);
        return (-2);//TIMEOUT
    }
	//end added by liaomch
	
    //turn_byte_order((unsigned char *)&i_len,(unsigned char *)pBuf,(short int)4);

	int nTemp = 0;
	memcpy(&nTemp, pBuf, sizeof(int));
	i_len = ntohl(nTemp);  

	if (i_len > nBufLen)
		return( END_FAILED );
		//return -3;//要收的太長了

    i_read = tcp_recv(nSockfd, pBuf+4, i_len-4, nTimeout);
	//pthread_mutex_unlock(&m_recv_mutex);

    if ( i_read == -1 )
    {
        return( END_FAILED );
    }

	//added by liaomch 2003-10-17
	//超時收到長度為0
    if ( i_read == 0)
    {
		//pthread_mutex_unlock(&m_recv_mutex);
        return (-2);//TIMEOUT
    }
	//end added by liaomch

    if ( i_read + 4 != i_len )
    {
		printf("===received a bad package!===\n"
			"\tmust recv = %d, real recv = %d\n", i_len, (i_read));
        return(END_FAILED);
    }

	*pLen = i_len;
    return (END_SUCCEED);
}

int CSGIPComm::tcp_recv(int nSockfd, char *pBuf, int nLen, int nTimeOut)
{
	char   *ps_buf = pBuf;
	int    l_read_so_far = 0;
	int    l_read = 0;
	int    l_len = 0;

	if (nSockfd < 0)
		return END_FAILED;

	//time_t tStartRead = time(NULL);

	//time out set
	fd_set	rset;
	struct timeval	tval;
	
	memset(&tval, 0, sizeof(tval));
	
	if( nTimeOut < 0 )
		nTimeOut=0;
	
	FD_ZERO(&rset);
	FD_SET(nSockfd,&rset);
	
	tval.tv_sec = nTimeOut;
	tval.tv_usec = 0 ;
	//-------------
	
	while ( l_read_so_far < nLen ) 
	{
		ps_buf += l_read_so_far;
		l_len = nLen - l_read_so_far;
		
		if((select(nSockfd+1,&rset,NULL,NULL,nTimeOut?&tval:NULL)) == 0 )
		{
			printf("recv time out return!\n");
			return	0;//time out
		}

		l_read = read(nSockfd, ps_buf, l_len);

		//read returns by itself (not because of timed out)
		if ( l_read <= 0 ) 
		{
			perror("read error!");

			if (errno == EINTR)
			{
 				l_read = 0;
				return END_FAILED;
			}
 			else
 				return END_FAILED;
		} 
		else  if ( l_read > 0 ) 
		{
			l_read_so_far += l_read;
		}
    }

    return( l_read_so_far );
} 

 
 int CSGIPComm::ConnectTimeOut(int sockfd, const struct sockaddr *saptr, socklen_t socklen, int secs)
{
	int	flags;
	int	n,error;
	socklen_t	len;
	fd_set	rset,wset;
	struct timeval	tval;

	if(sockfd <= 0 || saptr == (struct sockaddr *)0)
		return	END_FAILED;
	if( secs < 0 )
		secs=0;
	error=0;
	flags=fcntl(sockfd,F_GETFL,0);
	fcntl(sockfd,F_SETFL,flags|O_NONBLOCK);

	if((n=connect(sockfd,saptr,socklen)) < 0 )
    {
	    if(errno != EINPROGRESS)
        { 
			return(END_FAILED);
        }
    }
	if(n == 0 )
		goto	done;
	FD_ZERO(&rset);
	FD_SET(sockfd,&rset);

	wset =rset;
	tval.tv_sec = secs;
	tval.tv_usec = 0 ;

	if(( n=select(sockfd+1,&rset,&wset,NULL,secs?&tval:NULL)) == 0 )
	{
		close(sockfd);
		errno=ETIMEDOUT;
		return	END_FAILED;
	}
	
	if(FD_ISSET(sockfd,&rset) || FD_ISSET(sockfd,&wset)) 
	{
		len=sizeof(error);
		if( getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,&len) < 0 )
			return	END_FAILED;
	}
	else
		return	END_FAILED;
done:
	fcntl(sockfd,F_SETFL,flags);
	if(error)
	{
		close(sockfd);
		errno=error;
		return	END_FAILED;
	}
	return	END_SUCCEED;
}

//********************************************************************
//	TcpConnect
//		Build up a TCP connection to host at port.  This is used at
//		client part, returns the socket fd on success, or -1 on error
//********************************************************************
int CSGIPComm::TcpConnect(char* host, int port)
{
	int fd;
	struct sockaddr_in sin;

	if((fd=socket(AF_INET, SOCK_STREAM, 0))<0)
	{
		return END_FAILED;
	}	

	// resolv host to sockaddr_in
	bzero(&sin, sizeof(sin));
	
	//try A.B.C.D numeric IP format address first
	if((sin.sin_addr.s_addr=inet_addr(host))==INADDR_NONE)
	{
		//not numeric IP format, try text format
		struct hostent he;
		//int err, ret;
		//here we use **_r format, 'coz it might be run under multithreading
		//environment.
		//However, some such functions are not standardized yet, so we need
		//know OS platform we are on.
		#ifdef LINUX		
		//LINUX: gethostbyname_r needs six parameters 
		//it return 0 on success, otherwise -1 returned, and 
		//the error code is in err:
		// ERANGE:	buf size too small
		// HOST_NOT_FOUND: Authoritive Answer Host not found
		// TRY_AGAIN:	Non-Authoritive Host not found, or SERVERFAIL
		// NO_RECOVERY: Non recoverable errors, FORMERR, REFUSED, NOTIMP
		// NO_DATA:	    Valid name, no data record of requested type
		// NO_ADDRESS:  no address, look for MX record
		if ((ret=gethostbyname_r(host, &he, buf, sizeof(buf), &p, &err)) < 0 )
		{
			close(fd);
			return END_FAILED; //Resolve failed! :(
		}	
		#elif defined SOLARIS
		//NOTE: be sure to link libnsl.o while compiling
		//     that is, use -lnsl in gcc command options
		//SOLARIS: gethostbyname_r takes five parameters, 
		//it returns the pointer to he in p on success, otherwise NULL
		//the error code is also in err, read above comments
		p=gethostbyname_r(host, &he, buf, sizeof(buf), &err);
		if(!p)
		{
			close(fd);
			return END_FAILED;
		}	
		#endif
		memcpy(&sin.sin_addr.s_addr, he.h_addr, sizeof(sin.sin_addr.s_addr));
	}
	// here we assume we are always under IPv4 environment.
	// If one day shifted to other network environment, such as IPv6,
	// following code should also be under modification
	sin.sin_family=AF_INET;
	sin.sin_port=htons(port);
	//connect
	if(connect(fd, (struct sockaddr*)&sin, sizeof(sin))<0)
	{
		close(fd);
		return END_FAILED;
	}
	return fd;
}	

//********************************************************************
//  TcpConnecto:
//      Time out version.
//      Build up a TCP connection to host at port.  This is used at
//      client part, returns the socket fd on success, or -1 on error
//********************************************************************
int CSGIPComm::TcpConnectTimeOut(char* host, int port,int secs)
{
	int fd;
	struct sockaddr_in sin;

	if((fd=socket(AF_INET, SOCK_STREAM, 0))<0)
	{
		return END_FAILED;
	}	
	// resolv host to sockaddr_in
	bzero(&sin, sizeof(sin));
	
	//try A.B.C.D numeric IP format address first
	if((sin.sin_addr.s_addr=inet_addr(host))==INADDR_NONE)
	{
		//not numeric IP format, try text format
		struct hostent he; 
		//int err, ret;
		//here we use **_r format, 'coz it might be run under multithreading
		//environment.
		//However, some such functions are not standardized yet, so we need
		//know OS platform we are on.
		#ifdef LINUX		
		//LINUX: gethostbyname_r needs six parameters 
		//it return 0 on success, otherwise -1 returned, and 
		//the error code is in err:
		// ERANGE:	buf size too small
		// HOST_NOT_FOUND: Authoritive Answer Host not found
		// TRY_AGAIN:	Non-Authoritive Host not found, or SERVERFAIL
		// NO_RECOVERY: Non recoverable errors, FORMERR, REFUSED, NOTIMP
		// NO_DATA:	    Valid name, no data record of requested type
		// NO_ADDRESS:  no address, look for MX record
		if ((ret=gethostbyname_r(host, &he, buf, sizeof(buf), &p, &err)) < 0 )
		{
			 close(fd);
			 return END_FAILED; //Resolve failed! :(
		}
		#elif defined SOLARIS
		//NOTE: be sure to link libnsl.o while compiling
		//     that is, use -lnsl in gcc command options
		//SOLARIS: gethostbyname_r takes five parameters, 
		//it returns the pointer to he in p on success, otherwise NULL
		//the error code is also in err, read above comments
		p=gethostbyname_r(host, &he, buf, sizeof(buf), &err);
		if(!p)
		{
            close(fd);
			return END_FAILED;
		}	
		#endif
		memcpy(&sin.sin_addr.s_addr, he.h_addr, sizeof(sin.sin_addr.s_addr));
	}
	// here we assume we are always under IPv4 environment.
	// If one day shifted to other network environment, such as IPv6,
	// following code should also be under modification
	sin.sin_family=AF_INET;
	sin.sin_port=htons(port);
	//connect
	if (ConnectTimeOut(fd, (struct sockaddr*)&sin, sizeof(sin),secs)<0 )
	{
		close(fd);
		return END_FAILED;
	}
	return fd;
}

int CSGIPComm::CreateServer(int Iport)
{
	int nSockfd = socket(AF_INET, SOCK_STREAM, 0);
	sockaddr_in  ServerAddr;

	if(nSockfd < 0)
		return END_FAILED;

	memset(&ServerAddr, 0, sizeof(ServerAddr));
	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	ServerAddr.sin_port = htons(Iport);
	int nOptVal = 1;

	setsockopt(nSockfd,SOL_SOCKET,SO_REUSEADDR,&nOptVal,sizeof(nOptVal));

	if(bind(nSockfd, (sockaddr*)&ServerAddr, sizeof(ServerAddr)) < 0)
		return END_FAILED;

	if (g_iAcceptNum < 15)
		g_iAcceptNum = 15;
	
	if(listen(nSockfd, g_iAcceptNum) < 0)
		return END_FAILED;

	return nSockfd;
}

int CSGIPComm::GetAccept( int nSockfd )
{
	int  TempSock;
	if(nSockfd < 0)
		return END_FAILED;

	struct sockaddr_in client_addr;
	int nCliAddrLen = 0;
	nCliAddrLen = sizeof(client_addr);
	memset(&client_addr, 0, nCliAddrLen);

	TempSock = accept(nSockfd, (struct sockaddr *)&client_addr, (socklen_t *)&nCliAddrLen);

	if(TempSock < 0)
		return END_FAILED;
	else
	{
		printf("IPADDR:[%s] accepted succeed!\n", inet_ntoa(client_addr.sin_addr));
		return TempSock;
	}
 }

void CSGIPComm::turn_byte_order( unsigned char *ps_dest, unsigned char *ps_src, short t_len )
{
#ifdef SUN_CPU
    memcpy( ps_dest, ps_src, t_len);
#else
    while( t_len > 0 )
    {
        *ps_dest = *(ps_src + t_len -1 );
        ps_dest ++;
        t_len --;
    }
#endif
	return;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品日产第一区二区三区高清版| 久久亚洲一级片| 91美女片黄在线观看| 欧美在线视频全部完| 欧美精品一区二区三区一线天视频| 久久精品欧美一区二区三区不卡 | 欧美精品一二三| 久久欧美一区二区| 亚洲在线视频网站| 国产另类ts人妖一区二区| 91一区二区三区在线观看| 欧美狂野另类xxxxoooo| 国产欧美日韩视频在线观看| 粉嫩在线一区二区三区视频| 欧美三级韩国三级日本三斤| 久久久久久99久久久精品网站| 一区二区三区在线免费观看 | 日韩高清在线电影| 不卡av在线免费观看| 日韩美女视频在线| 亚洲国产一区在线观看| 欧美一区二区黄| 中文字幕亚洲不卡| 国产精品亚洲一区二区三区妖精| 欧美日韩免费视频| 日韩美女视频一区| 国产精品亚洲第一 | 亚洲成人资源在线| 99久久精品国产麻豆演员表| 亚洲精品一区二区精华| 天堂一区二区在线免费观看| 日本精品一区二区三区高清| 国产拍揄自揄精品视频麻豆| 国产一区二区三区不卡在线观看| 欧美高清dvd| 亚洲一区二区五区| 在线观看视频91| 一区二区在线观看av| 94色蜜桃网一区二区三区| 久久久久成人黄色影片| 久久99精品国产.久久久久| 91麻豆国产自产在线观看| 日韩一区二区在线观看视频 | 国产三级一区二区| 国产资源在线一区| 久久久av毛片精品| 韩国成人福利片在线播放| 欧美一激情一区二区三区| 美腿丝袜亚洲一区| 精品美女被调教视频大全网站| 蜜乳av一区二区| 精品人伦一区二区色婷婷| 国产一区二区精品久久91| 久久午夜电影网| 狠狠色综合色综合网络| 国产亚洲精品7777| 成人av网站在线观看免费| 国产精品二区一区二区aⅴ污介绍| heyzo一本久久综合| 久久久蜜桃精品| 不卡免费追剧大全电视剧网站| 日韩一区欧美小说| 欧美三级一区二区| 日韩精品免费专区| 精品国产免费久久| 成人性生交大片免费| 亚洲色图欧美在线| 欧美亚洲免费在线一区| 麻豆精品精品国产自在97香蕉| 欧美久久免费观看| 国内精品国产三级国产a久久| 国产日韩三级在线| 色婷婷综合久久久中文字幕| 五月天一区二区| 久久久国产精华| 日本精品视频一区二区| 青青草一区二区三区| 亚洲欧洲日本在线| 在线播放欧美女士性生活| 国产精品亚洲视频| 亚洲资源在线观看| 91精品中文字幕一区二区三区 | 亚洲一区av在线| 欧美mv日韩mv国产| 国产.精品.日韩.另类.中文.在线.播放| 久久久久一区二区三区四区| 国产电影一区在线| 五月天中文字幕一区二区| 国产欧美一区二区三区鸳鸯浴 | 婷婷国产v国产偷v亚洲高清| 精品国产乱码久久| 欧美性受xxxx黑人xyx性爽| 蜜桃视频在线观看一区二区| 亚洲天堂av老司机| 精品福利一二区| 欧美日韩国产大片| 国产一区二区伦理片| 亚洲国产精品一区二区www在线| 欧美日韩久久一区| 一本色道综合亚洲| 国产精品一二三四区| 麻豆freexxxx性91精品| 一区二区欧美视频| 日本一区免费视频| 精品久久五月天| 欧美电影在线免费观看| 一本到一区二区三区| 免费欧美日韩国产三级电影| 国产人妖乱国产精品人妖| 欧美日韩精品一区二区三区蜜桃| 99精品国产99久久久久久白柏| 激情综合网av| 丝袜亚洲另类丝袜在线| 亚洲一区二区视频| 亚洲女人的天堂| 国产精品久久久久久户外露出| 欧美视频完全免费看| 丁香婷婷综合色啪| 久久精品99国产精品日本| 免费人成网站在线观看欧美高清| 亚洲成人自拍网| 亚洲一区二区免费视频| 一区二区三区成人| 一区二区免费看| 一区二区三区中文字幕在线观看| 欧美成人乱码一区二区三区| 一本到高清视频免费精品| 成人综合在线观看| 粉嫩欧美一区二区三区高清影视 | 久久久不卡影院| 久久亚洲综合色一区二区三区| 欧美日韩视频第一区| 精品视频123区在线观看| 精品婷婷伊人一区三区三| 欧美日韩不卡视频| 欧美日本不卡视频| 91精品免费在线观看| 日韩欧美国产电影| 久久久久久久久一| 国产精品免费av| 综合久久久久久| 亚洲国产成人porn| 日韩不卡在线观看日韩不卡视频| 日韩精品三区四区| 国产一区亚洲一区| 岛国一区二区三区| 91视频免费看| 欧美日韩精品一区二区三区蜜桃| 久久久久久久久免费| 亚洲一区二区视频在线| 国产主播一区二区三区| 色诱亚洲精品久久久久久| 日韩午夜激情av| 亚洲欧洲av色图| 日本大胆欧美人术艺术动态| 91婷婷韩国欧美一区二区| 日韩免费高清视频| 亚洲免费视频成人| 国产精品一区二区91| 欧美日韩精品专区| 国产精品欧美久久久久无广告| 视频一区二区中文字幕| av色综合久久天堂av综合| 日韩免费电影网站| 一区二区不卡在线播放| 国产成人精品三级麻豆| 欧美一区二区私人影院日本| 亚洲色图欧洲色图婷婷| 国产成人亚洲精品狼色在线| 91麻豆精品国产91久久久资源速度| 国产精品进线69影院| 国内精品写真在线观看| 在线观看91av| 亚洲午夜三级在线| 92国产精品观看| 国产日韩视频一区二区三区| 蜜臀久久久久久久| 欧美美女黄视频| 亚洲精品国产a久久久久久| 成人国产免费视频| 久久久影院官网| 国产一区二区三区四区五区入口| 欧美高清你懂得| 亚洲风情在线资源站| 日本韩国欧美在线| 日av在线不卡| 欧美日韩一区二区三区在线看| 亚洲三级电影全部在线观看高清| 国产91精品在线观看| 久久久99精品免费观看不卡| 久久99精品久久只有精品| 日韩欧美精品在线| 麻豆91在线播放| 日韩亚洲国产中文字幕欧美| 丝袜亚洲另类丝袜在线| 欧美一区二区三区色| 美国毛片一区二区三区| 欧美大黄免费观看| 激情综合五月婷婷| 中文字幕免费一区|