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

socketref,再見!高德

https://github.com/adoggie

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用鏈接

留言簿(54)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

#define OUT
#define INOUT
#define IN

#define INIT_LIST_HEAD(x)?? ?

#define btsc_TRUE ?? ?0
#define btsc_FALSE?? ?1
#define btsc_NULL ?? ?0

struct list_head{
?? ?struct list_head* prev,*next;
};


struct btsc_Property{
?? ?char * ?? ??? ?name;
?? ?char * ?? ??? ?value;?? ??? ?
};


struct btsc_Packet{
?? ?/*struct list_head?? ?list;*/
?? ?struct btsc_Property** ?? ?properties;
?? ?int?? ??? ??? ??? ?size;
?? ?int?? ??? ??? ??? ?capacity;
?? ?struct btsc_Context?? ?*?? ?ctx;
};

struct btsc_Packet* ?? ?btsc_Packet_Alloc(struct btsc_Context* );
void?? ??? ??? ??? ??? ?btsc_Packet_Free(struct btsc_Packet*);

struct btsc_Property*?? ?btsc_Property_Alloc(struct btsc_Context* ,char * name,char * value);
void?? ??? ??? ??? ??? ?btsc_Property_Free(struct btsc_Property*);


struct btsc_Property* ?? ?btsc_Property_Get(struct btsc_Packet* packet,char * name); ?? ?
void?? ??? ??? ??? ??? ?btsc_Property_Append(struct btsc_Packet* packet,struct btsc_Property * );


struct btsc_Context{
?? ?void (*tx)(struct btsc_Context*,unsigned char * data,int len);?? ??? ?
?? ?int (*notifier)(struct btsc_Packet* packet);/*外部釋放packet,返回NULL*/?? ??? ?
?? ?int?? ??? ?packet_cached_size;
?? ?int?? ??? ?recv_cached_capacity;?? ??? ??? ??? ??? ??? ?
?? ?char*?? ?recv_buff;?? ??? ??? ??? ??? ??? ??? ??? ??? ?
?? ?int?? ??? ?recv_size;?? ??? ?
?? ?void*?? ?user;?? ?// 外部數(shù)據(jù)傳遞?? ??? ??? ??? ??? ??? ??? ?
};


int ?? ?btsc_init(struct btsc_Context* IN ctx);?? ?
void ?? ?btsc_cleanup(struct btsc_Context* IN ctx);
int?? ??? ?btsc_Pack(struct btsc_Context* IN ctx,struct btsc_Packet* packet,unsigned char * INOUT buff,int* INOUT size);?? ?
void?? ?btsc_Parse(struct btsc_Context* , char * data,int len);


#define BTSC_PACKET_BEGIN(ctx) {\
?? ??? ??? ??? ??? ??? ??? ??? ?struct btsc_Context* _ctx_internel;\
?? ??? ??? ??? ??? ??? ??? ??? ?struct btsc_Packet * _pkt ;\
?? ??? ??? ??? ??? ??? ??? ??? ?_ctx_internel= (ctx);\
?? ??? ??? ??? ??? ??? ??? ??? ?_pkt = btsc_Packet_Alloc(_ctx_internel);
?? ??? ??? ??? ??? ??? ??? ??? ?
/* key is not suitable for vairable*/?? ??? ??? ??? ??? ??? ??? ??? ?
#define BTSC_NEW_PROPERTY(key,value)?? ?{\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?struct btsc_Property * _ppt =btsc_Property_Alloc(_ctx_internel,key,value);\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?btsc_Property_Append(_pkt,_ppt);\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}
#define BTSC_PACKET_END()?? ??? ?btsc_Pack(_ctx_internel,_pkt,btsc_NULL,0);\
?? ??? ??? ??? ??? ??? ??? ??? ?btsc_Packet_Free(_pkt);\
?? ??? ??? ??? ??? ??? ??? ??? ?}

#define BTSC_FOREACH(packet,ppt)?? ?{\
?? ??? ??? ??? ??? ??? ??? ??? ??? ?int n;\
?? ??? ??? ??? ??? ??? ??? ??? ??? ?for(n=0;n<packet->size;n++){\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?ppt = packet->properties[n];
#define BTSC_END_FOREACH()?? ??? ??? ?}\
?? ??? ??? ??? ??? ??? ??? ??? ?}








/*
??? name:??? ??? ??? btsc
??? ??? ??? ??? ??? serial communicating? with bluetooth and app-user
??? desc:??? ??? ??? pair parameter codec
???
??? ??? packet=[ key:name,...]
??? ???
??? implemented: ??? zhangbin ,? 3 hours occupied
??? date:??? ??? ??? 2007-01-26
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _UNIX
#include <unistd.h>
#endif
#include "btsc.h"

#define PACKET_HEAD??? ??? '<'
#define PACKET_TAIL??? ??? '>'
#define PROPERTY_DELIMITER??? ','
#define PAIR_DELIMITER??? ??? '='
#define ESCAPE_CHAR??? ??? ??? '\\'


int calcEscapleLength(char * str);
char* escape_copy(char * dest,char * src);
void trim_escape_copy(char * dest,char * src,int size);
int? calcPacketLength(struct btsc_Packet* pkt);
int??? is_escape_char(char c);
void parseProperty(struct btsc_Packet * pkt,char * s,char * e);
void parsePacket(struct btsc_Context* ctx,char * s,char* e);
char* ??? __memchr(char * s,char* e,char c);

char escape_ch_table[]={PACKET_HEAD,PACKET_TAIL,PROPERTY_DELIMITER,PAIR_DELIMITER,ESCAPE_CHAR,'\0'};

struct btsc_Packet* ??? btsc_Packet_Alloc(struct btsc_Context* ctx){???
??? struct btsc_Packet * pt = malloc(sizeof(struct btsc_Packet));??? ???
??? pt->size = 0;
??? pt->capacity = ctx->packet_cached_size;
??? pt->properties=malloc(pt->capacity*sizeof(struct btsc_Property*));???
??? pt->ctx = ctx;
??? return pt;???
}

void??? btsc_Packet_Free(struct btsc_Packet* pt){???
??? struct btsc_Property** tmp;
??? if( !pt ) ??? return ;
??? tmp = pt->properties;
??? while(pt->size--){
??? ??? btsc_Property_Free(*tmp++);??? ??? ??? ???
??? }??? ???
??? if( pt->properties){
??? ??? free(pt->properties);?
??? }
??? free(pt);
}


struct btsc_Property*??? btsc_Property_Alloc(struct btsc_Context* ctx,char * name,char * value){
??? struct btsc_Property * ppt;
??? printf("enter btsc_Property_Alloc()\n");
??? ppt = malloc( sizeof( struct btsc_Property) );
??? if(!ppt)??? printf("error: malloc failed (s1)\n");
??? ppt->name = malloc( strlen(name)+1);
??? if( !ppt->name ) printf("error: malloc failed (s2)\n");
??? strcpy(ppt->name,name);???
??? ppt->value = malloc( strlen(value)+1);
??? if( !ppt->value) printf("error: malloc failed (s3),str:%s, len: %d\n",value,strlen(value)+1);
??? strcpy( ppt->value,value);
??? return ppt;
}

void??? ??? btsc_Property_Free(struct btsc_Property* ppt){
??? if( !ppt )??? return;
??? free( ppt->name);
??? free( ppt->value);
??? free( ppt);
}

/* scan pointer array */
struct btsc_Property* ??? btsc_Property_Get(struct btsc_Packet* pkt,char * name){
??? int size;
??? struct btsc_Property* ppt;
??? size = pkt->size;
??? while(size--){
??? ??? ppt = pkt->properties[size];
??? ??? if( !strcmp( name, ppt->name ) ){
??? ??? ??? return ppt;/*that's ok */
??? ??? }
??? }
??? return btsc_NULL;
}

/* low effeciency, memory allocation,more costs*/
void??? btsc_Property_Append(struct btsc_Packet* pt,struct btsc_Property * ppt){
??? struct btsc_Property** tmpppt;
??? if( pt->size==pt->capacity){ ??? ???
??? ??? pt->capacity += pt->ctx->packet_cached_size;???
??? ??? tmpppt = pt->properties;??? ???
??? ??? pt->properties = malloc( pt->capacity * sizeof( struct btsc_Property**) );
??? ??? memcpy( pt->properties, tmpppt, pt->size * sizeof( struct btsc_Property**));
??? ??? free( tmpppt);
??? }
??? pt->properties[pt->size++]=ppt;???
}

int ??? btsc_init(struct btsc_Context* ctx){???
??? ctx->packet_cached_size = 10;???
??? if( ctx->recv_cached_capacity==0){
??? ??? ctx->recv_cached_capacity = 1024*2;???
??? }
??? ctx->recv_buff = malloc( ctx->recv_cached_capacity );
??? ctx->recv_size = 0;
??? return btsc_TRUE;
}

void ??? btsc_cleanup(struct btsc_Context* ctx){
??? free(ctx->recv_buff);???
}

/*
**??? name:??? calcEscapleLength
**??? desc:??? 計(jì)算含轉(zhuǎn)義字符串長度
*/
int ??? calcEscapleLength(char * str){
??? int len;
??? char * pesc;
??? len = 0;???
??? while( *str ){
??? ??? pesc = escape_ch_table;
??? ??? while( *pesc ){
??? ??? ??? if( *pesc==*str){
??? ??? ??? ??? len++;
??? ??? ??? ??? break;
??? ??? ??? }
??? ??? ??? pesc++;
??? ??? }??? ???
??? ??? str++;
??? }???
??? return len;
}


char* escape_copy(char * dest,char * src){
??? char * pesc;
??? while( *src ){
??? ??? pesc = escape_ch_table;
??? ??? while( *pesc ){
??? ??? ??? if( *pesc==*src){
??? ??? ??? ??? *dest++=ESCAPE_CHAR;
??? ??? ??? ??? break;
??? ??? ??? }
??? ??? ??? pesc++;
??? ??? }
??? ??? *dest++=*src++;??? ??? ??? ???
??? }???
??? return dest;???
}

void trim_escape_copy(char * dest,char * src,int size){
??? int last_escape = btsc_FALSE;
??? while( size--){
??? ??? if( *src == ESCAPE_CHAR && last_escape != btsc_TRUE){??? ???
??? ??? ??? last_escape = btsc_TRUE??? ;
??? ??? ??? src++;
??? ??? ??? continue;
??? ??? }
??? ??? last_escape = btsc_FALSE;
??? ??? *dest++=*src++;??? ???
??? }
}

int?? ??? calcPacketLength(struct btsc_Packet* pkt){
??? int len;
??? int size;
??? struct btsc_Property* ppt;???
??? len = 0;
??? size = pkt->size;
??? while( size--){
??? ??? ppt = pkt->properties[size];???
??? ??? len+=strlen(ppt->name)+strlen(ppt->value);???

??? ??? len+= calcEscapleLength(ppt->name);
??? ??? len+= calcEscapleLength(ppt->value);???
??? }
??? len+= pkt->size*2+1;
??? return? len;
}


int??? ??? btsc_Pack(struct btsc_Context*? ctx,struct btsc_Packet* pkt,unsigned char * obuff,int* osize){
??? struct btsc_Property* ppt;
??? int size;
??? int len;
??? unsigned char * buff;
??? char * pbuff;
??? len = calcPacketLength( pkt);
??? buff = malloc( len );
??? size = pkt->size;
??? pbuff = (char*)buff;
??? *pbuff++=PACKET_HEAD;???
??? while( size--){
??? ??? ppt = pkt->properties[size];???
??? ??? pbuff = escape_copy(pbuff,ppt->name);
??? ??? *pbuff++=PAIR_DELIMITER;
??? ??? pbuff = escape_copy(pbuff,ppt->value);
??? ??? if( size ){
??? ??? ??? *pbuff++=PROPERTY_DELIMITER;??? ??? ???
??? ??? }
??? }
??? *pbuff = PACKET_TAIL;
??? if( ctx->tx ){
??? ??? ctx->tx(ctx,buff,len);
??? }
??? if( obuff && *osize >=len){
??? ??? memcpy( obuff, buff ,len);
??? ??? *osize = len;
??? }

??? free(buff);
??? return btsc_TRUE;???
}

/* e not in range*/
char* ??? __memchr(char * s,char* e,char c){
??? while( s!=e){
??? ??? if( *s == c){
??? ??? ??? return s;
??? ??? }??? ???
??? ??? s++;
??? }
??? return btsc_NULL;
}

int??? ??? is_escape_char(char c){
??? return btsc_FALSE;???
}

/*
??? name: parseProperty
??? desc: 指定內(nèi)存范圍中提取屬性? key=>value
??? ??? 搜索包含e
??? params:???
??? ??? pkt??? --??? 消息數(shù)據(jù)包
??? ??? s??? --??? 起始內(nèi)存地址
??? ??? e??? --??? 結(jié)束地址 ,
*/
void parseProperty(struct btsc_Packet * pkt,char * s,char * e){
??? char * p1,*p2;
??? int n;
??? struct btsc_Property*??? ppt;
??? p1 = s ;
??? p2 = e;
__REPEAT:???
??? p1 = __memchr(p1,e+1,PAIR_DELIMITER);
??? if( p1 ){
??? ??? if( *(p1-1) == ESCAPE_CHAR ){
??? ??? ??? p1++;
??? ??? ??? goto __REPEAT;
??? ??? }
??? ??? ppt = malloc( sizeof( struct btsc_Property ));
??? ??? n = p1-s; ??? ???
??? ??? ppt->name = malloc( n+1 );
??? ??? memset(ppt->name,0,n+1);??? ???
??? ??? trim_escape_copy(ppt->name,s,n);
??? ???
??? ??? n =e-p1;
??? ??? ppt->value = malloc( n+1);
??? ??? memset(ppt->value,0,n+1);
??? ??? trim_escape_copy(ppt->value,p1+1,n);
??? ???
??? ??? btsc_Property_Append(pkt,ppt);
??? }
}

/*
??? name: parsePacket
??? desc:??? 分解指定內(nèi)存到包結(jié)構(gòu)
??? ??? ??? 成功分解出包立刻回送到應(yīng)用接收者 ( btsc_Context::notifier)
??? param:
??? ??? s,e ??? 內(nèi)存地址 (處e)

** 緩沖區(qū)還需進(jìn)一步測試,包括緩沖區(qū)大小調(diào)節(jié), 不完整協(xié)議包格式的容錯
*/
void ??? parsePacket(struct btsc_Context* ctx,char * s,char* e){
??? char *p,*p1,*p2;
??? struct btsc_Packet * pkt;
??? if( e-s <=1 ){
??? ??? return ;
??? }
??? pkt = btsc_Packet_Alloc(ctx);
???
??? p1 = s+1;
??? p2 = e-1;
??? p = p1;
__REPEAT:???
??? p = __memchr(p,e,PROPERTY_DELIMITER);
??? if( p ){
??? ??? if( *(p-1)==ESCAPE_CHAR){
??? ??? ??? p = p+1;
??? ??? ??? goto __REPEAT;
??? ??? }
??? ??? parseProperty(pkt,p1,p-1);
??? ??? p1 = ++p;
??? ??? goto __REPEAT;
??? }
??? /*allow one property reside in*/
??? parseProperty(pkt,p1,e-1);
??? if( ctx->notifier ){
??????? if(ctx->notifier(pkt)){ /* nonzero value, delete internal*/
??????????? btsc_Packet_Free(pkt);??? ???????
??????? }
??? }else{
??? ?? btsc_Packet_Free(pkt);???
??? }
}

void??? btsc_Parse(struct btsc_Context* ctx, char * data,int size){
??? int len ;
_RESTART:
??? while( size ){
??? ??? len = ctx->recv_cached_capacity - ctx->recv_size;
??? ??? if( len >0){
??? ??? ??? if( size <= len){
??? ??? ??? ??? len = size;
??? ??? ??? ??? size = 0;
??? ??? ??? }else{
??? ??? ??? ??? size-=len;
??? ??? ??? }
??? ??? ??? memcpy( ctx->recv_buff+ctx->recv_size,data,len);
??? ??? ??? ctx->recv_size+=len;
??? ??? ??? data+=len;
??? ??? }???
??? ???
??? ??? {
??? ??? ??? char * p1,*p2;??? ??? ???
_RESCAN:??? ??? ???
??? ??? ??? p1 = ctx->recv_buff;
_RESCAN_HEAD:??? ??? ??? ?
??? ??? ??? p1 = __memchr(p1,ctx->recv_buff+ctx->recv_size,PACKET_HEAD);??? ??? ???
??? ??? ??? if( !p1 ){
??? ??? ??? ??? ctx->recv_size =0;
??? ??? ??? ??? if( size ){
??? ??? ??? ??? ??? goto _RESTART;
??? ??? ??? ??? }
??? ??? ??? }
??? ??? ??? if( p1>ctx->recv_buff && *(p1-1)==ESCAPE_CHAR){ /* "\<" */
??? ??? ??? ??? p1++;
??? ??? ??? ??? goto _RESCAN_HEAD;???
??? ??? ??? }
??? ??? ???
??? ??? ??? /*move backward*/
??? ??? ??? ctx->recv_size -=(p1-ctx->recv_buff);
??? ??? ??? memmove(ctx->recv_buff,p1, ctx->recv_size);
??? ??? ??? p1=ctx->recv_buff;
??? ??? ??? p2 = p1+1;
_RESCAN_TAIL:??? ??? ???
??? ??? ??? p2 = __memchr(p2,ctx->recv_buff+ctx->recv_size,PACKET_TAIL);
??? ??? ??? if( !p2 ){
??? ??? ??? ??? if( ctx->recv_size == ctx->recv_cached_capacity ){
??? ??? ??? ??? ??? ctx->recv_size? = 0;
??? ??? ??? ??? }
??? ??? ??? ??? goto _RESTART;
??? ??? ??? }
??? ??? ??? if( *(p2-1) == ESCAPE_CHAR ){
??? ??? ??? ??? p2++;
??? ??? ??? ??? goto _RESCAN_TAIL;???
??? ??? ??? }
??? ??? ???
??? ??? ??? parsePacket(ctx,p1,p2);
??? ??? ??? ctx->recv_size -=p2-p1+1;
??? ??? ??? if( ctx->recv_size ){
??? ??? ??? ??? memmove(ctx->recv_buff,p2+1,ctx->recv_size);
??? ??? ??? ??? goto _RESCAN;
??? ??? ??? }??? ??? ??? ?
??? ??? }??? ???
??? }
}

/*?? debug */
#ifdef _DEBUGX
void tx(unsigned char * data,int len);
void notifier(struct btsc_Packet* packet);
/*初始化上下文, tx=發(fā)送處理函數(shù),notifier=接收函數(shù)*/
struct btsc_Context c={tx:tx,notifier:notifier};

/*測試數(shù)據(jù)接收并解析*/
void rx(){???
??? ?char * msg="<MSG=HELLO,NAME=SCOTT>"
??? ???? ??? ??? "<MSG2=HELLO2,NAME2=SCOTT2>"
??? ???? ??? ??? "<MSG3=HELLO3,NAME3=SCOTT3>"; /*simulating data*/
??? int len = strlen(msg);
??? btsc_Parse(&c,msg,len);
}
/*發(fā)送處理過程*/
void tx(unsigned char * buff,int len){???
??? char *outmsg = malloc(1024*10);
??? memset(outmsg,0,1024*10);
??? memcpy(outmsg,buff,len);
??? printf("encode str: %s\n",outmsg);
??? free(outmsg);
??? btsc_Parse(&c,buff,len);
}

void notifier(struct btsc_Packet* packet){
??? struct btsc_Property * ppt;
??? ppt = btsc_Property_Get(packet,"MSG");
??? if(ppt)
??? ??? printf("property get: MSG=>%s\n",ppt->value);
??? /*遍歷包內(nèi)屬性參數(shù)*/
??? BTSC_FOREACH(packet,ppt);
??? printf("packet: %s=>%s\n",ppt->name,ppt->value);
??? BTSC_END_FOREACH();
}

int main(){
??? int r;
??? /*optional*/
??? c.recv_cached_capacity = 1024; /*初始化接收緩沖區(qū)大小 byte*/
??? c.packet_cached_size = 5;??? /*消息包緩沖屬性個數(shù)*/
??? btsc_init(&c);??? ??? ??? /*上下文初始化*/
??? puts("test rx()...");
??? rx();??? /*接*/
??? puts("escape testing...");???
??? do{
??? ??? /*構(gòu)造消息包,并完成發(fā)送*/
??? ??? BTSC_PACKET_BEGIN(&c);
??? ??? BTSC_NEW_PROPERTY("MSG","calling");

??? ??? BTSC_PACKET_END();???
??? ??? usleep(1000*50);
??? ??? printf(">>seq:%d\n",r);
??? }while(0);
??? ???
??? btsc_cleanup(&c);???
???
??? return 0;
}


#endif

posted on 2007-02-23 22:54 放屁阿狗 閱讀(1101) 評論(0)  編輯 收藏 引用 所屬分類: C++/Boost/STL/Template
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美xx视频| 国产精品国产精品| 亚洲高清成人| 欧美国产先锋| 欧美xxx在线观看| 99成人在线| 亚洲一区在线观看免费观看电影高清 | 国产精品久久999| 性做久久久久久免费观看欧美| 亚洲制服欧美中文字幕中文字幕| 国产噜噜噜噜噜久久久久久久久| 欧美在线视频免费播放| 久久久久久久综合| 亚洲精品乱码| 亚洲一区二区三区涩| 精品av久久久久电影| 免费成人在线观看视频| 欧美日韩国产黄| 欧美综合第一页| 欧美成年人视频| 欧美一区二区精品| 麻豆91精品91久久久的内涵| 亚洲摸下面视频| 久久久久久9| 亚洲一区二区三区四区五区午夜 | 欧美与欧洲交xxxx免费观看| 亚洲国产日韩欧美| 亚洲一区二区高清| 亚洲国产欧美不卡在线观看| 亚洲深夜福利视频| 亚洲国产美女久久久久| 亚洲一区在线免费观看| 亚洲精品日韩在线观看| 亚洲欧美日韩视频二区| 日韩午夜三级在线| 欧美一级大片在线免费观看| 一区二区三区 在线观看视频| 欧美一区成人| 亚洲中字在线| 欧美精品亚洲精品| 美腿丝袜亚洲色图| 国产精品一区二区你懂得| 亚洲国产精品成人一区二区| 国产三级精品三级| 一区二区三区产品免费精品久久75| 亚洲电影网站| 久久精品国产视频| 欧美资源在线| 国产精品视频专区| 在线亚洲一区观看| 在线亚洲自拍| 欧美日韩国产专区| 亚洲黄一区二区三区| 亚洲国产欧美在线| 久久精品在线| 另类综合日韩欧美亚洲| 国产亚洲欧美一区二区三区| 午夜国产欧美理论在线播放| 亚洲主播在线观看| 欧美午夜视频网站| 一区二区三区.www| 亚洲一区二区三区免费在线观看| 欧美日本亚洲| 亚洲日韩欧美视频一区| 99www免费人成精品| 欧美激情一区二区三级高清视频| 亚洲国产精品国自产拍av秋霞| 亚洲第一天堂av| 老司机成人在线视频| 欧美第一黄网免费网站| 亚洲欧洲美洲综合色网| 麻豆国产精品一区二区三区 | 中文av一区二区| 欧美日韩在线播放一区| 中文国产成人精品久久一| 亚洲综合国产| 国产精品视频免费观看| 欧美一区免费视频| 男人的天堂亚洲| 亚洲伦理久久| 国产精品日韩二区| 欧美主播一区二区三区| 欧美大尺度在线| 一本久道久久综合中文字幕| 国产精品久久久一区二区三区| 校园春色综合网| 美女免费视频一区| 99一区二区| 国产精品一二三四| 可以看av的网站久久看| 亚洲美女av在线播放| 香蕉尹人综合在线观看| 在线欧美三区| 欧美吻胸吃奶大尺度电影| 欧美自拍偷拍| 亚洲精品久久视频| 久久成人人人人精品欧| 91久久精品美女高潮| 欧美午夜精品一区| 久久久综合香蕉尹人综合网| 一本色道精品久久一区二区三区 | 在线亚洲一区二区| 国产一区二区精品久久91| 欧美成年人视频网站欧美| 亚洲一区精品在线| 亚洲成色www8888| 午夜精品久久久久99热蜜桃导演| 在线日韩中文| 国产麻豆91精品| 欧美精品一区二| 久久精品国产精品亚洲| 一区二区三区高清| 欧美激情乱人伦| 久久精品视频99| 亚洲先锋成人| 亚洲精品之草原avav久久| 国产亚洲va综合人人澡精品| 欧美三日本三级三级在线播放| 久久久久久久网| 亚洲综合日韩在线| 亚洲美女黄网| 91久久国产综合久久| 免费国产一区二区| 久久精品色图| 欧美在线黄色| 亚洲图片欧洲图片av| 亚洲人成网站在线播| 激情婷婷欧美| 国产一区欧美日韩| 国产日韩一区欧美| 国产精品久久久久99| 欧美日韩裸体免费视频| 欧美精品一区二区三区很污很色的| 久久婷婷av| 久久精品亚洲| 久久av资源网| 久久久久久久久久久久久女国产乱| 午夜精品久久| 午夜精品久久久久久久男人的天堂 | 免费观看国产成人| 久久一区精品| 蜜臀99久久精品久久久久久软件| 久久婷婷久久一区二区三区| 久久精品30| 久久精视频免费在线久久完整在线看| 性做久久久久久久免费看| 亚洲一区二区三区在线观看视频| 正在播放欧美视频| 宅男精品导航| 亚洲欧美色一区| 欧美在线视频一区| 久久久久一区| 欧美成人免费网站| 亚洲国产日韩欧美综合久久| 亚洲精品麻豆| 亚洲一区二区三区乱码aⅴ| 亚洲欧美在线一区二区| 欧美一区二区三区在线| 久久久亚洲综合| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美综合二区| 麻豆av一区二区三区| 欧美激情精品久久久六区热门 | 久久久久久黄| 牛夜精品久久久久久久99黑人| 欧美激情一区二区三区高清视频 | 欧美日韩视频第一区| 国产精品麻豆欧美日韩ww| 国产一区二区三区四区在线观看| 在线观看成人av| 一本久道久久综合婷婷鲸鱼| 香蕉久久一区二区不卡无毒影院| 久久久综合网站| 亚洲人成小说网站色在线| 中文日韩在线| 久久噜噜噜精品国产亚洲综合| 欧美精品午夜| 国产综合欧美| 亚洲视频免费观看| 麻豆精品网站| 宅男噜噜噜66一区二区| 久久人人爽人人爽| 国产精品成人一区二区艾草| 亚洲第一综合天堂另类专| 亚洲一区美女视频在线观看免费| 蜜桃av一区二区三区| 亚洲色图在线视频| 欧美不卡视频一区发布| 国产日韩欧美91| 一本色道久久综合亚洲精品婷婷| 久久久人成影片一区二区三区| 夜夜嗨av一区二区三区网页| 久久gogo国模啪啪人体图| 欧美性感一类影片在线播放| 亚洲欧洲一区二区天堂久久| 久久九九久久九九| 亚洲一区二区三区在线视频| 欧美日韩1区2区| 亚洲国产美女精品久久久久∴| 久久精品国产久精国产爱|