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

socketref,再見!高德

https://github.com/adoggie

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

常用鏈接

留言簿(54)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

  1 
  2 /*
  3     name:     btsc.h
  4     desc:   藍牙串口通信數據包裝    
  5     writer:    zhangbin 
  6     date:    2007-01-25
  7     history:    
  8             2007-0206    zhangbin    
  9                 1. btsc_context增加 user
 10                 2. notifier函數原型增加 btsc_context參數,便于訪問上下文
 11             2008.06.16    scott
 12                 1. 增加crc校驗屬性 
 13                     CRC=12345
 14                     crc校驗和計算: 準備發送一個數據包之前,將默認crc屬性(CRC=00000)作為屬性包加入,然后將整個屬性包進行crc計算出校驗和
 15                                      將16位的crc sum 轉換成5字節的字符串替換包屬性CRC的值
 16                     <MSG=DEVICE-OPEN  CRC=00000> =>計算機校驗和 45322 
 17                     替換數據包屬性值=> <MSG=DEVICE-OPEN CRC=45322>  
 18                     發送
 19                 2. 增加 DataChecker
 20 */
 21 
 22 #ifndef _BTSC_H
 23 #define _BTSC_H
 24 
 25 #include <stdio.h>
 26 
 27 #define OUT
 28 #define INOUT
 29 #define IN
 30 
 31 #define INIT_LIST_HEAD(x)    
 32 
 33 #define btsc_TRUE     0
 34 #define btsc_FALSE    1
 35 #define btsc_NULL     0
 36 
 37 struct list_head{
 38     struct list_head* prev,*next;
 39 };
 40 
 41 
 42 struct btsc_Property{
 43     char *         name;
 44     char *         value;        
 45 };
 46 
 47 
 48 struct btsc_Packet{
 49     /*struct list_head    list;*/
 50     struct btsc_Property**     properties; 
 51     int                size;
 52     int                capacity;
 53     struct btsc_Context    *    ctx;
 54 };
 55 
 56 struct btsc_Packet*     btsc_Packet_Alloc(struct btsc_Context* );
 57 void                    btsc_Packet_Free(struct btsc_Packet*);
 58 
 59 struct btsc_Property*    btsc_Property_Alloc(struct btsc_Context* ,char * name,char * value);
 60 void                    btsc_Property_Free(struct btsc_Property*);
 61 
 62 
 63 
 64 struct btsc_Property*     btsc_Property_Get(struct btsc_Packet* packet,char * name);     
 65 void                    btsc_Property_Append(struct btsc_Packet* packet,struct btsc_Property * );
 66 
 67 
 68 
 69 struct btsc_Context{
 70     void (*tx)(struct btsc_Context*,unsigned char * data,int len);        
 71     int (*notifier)(struct btsc_Packet* packet);/*外部釋放packet,返回NULL*/        
 72     int        packet_cached_size;
 73     int        recv_cached_capacity;                        
 74     char*    recv_buff;                                    
 75     int        recv_size;        
 76     void*    user;    // 外部數據傳遞                            
 77     int        crc_check;    // 0 - nocrc, 1 crc check
 78 };
 79 
 80 
 81 int     btsc_init(struct btsc_Context* IN ctx);    
 82 void     btsc_cleanup(struct btsc_Context* IN ctx);
 83 int        btsc_Pack(struct btsc_Context* IN ctx,struct btsc_Packet* packet,unsigned char * INOUT buff,int* INOUT size);    
 84 void    btsc_Parse(struct btsc_Context* , char * data,int len);
 85 
 86 
 87 #define BTSC_PACKET_BEGIN(ctx) {\
 88                                 struct btsc_Context* _ctx_internel;\
 89                                 struct btsc_Packet * _pkt ;\
 90                                 _ctx_internel= (ctx);\
 91                                 _pkt = btsc_Packet_Alloc(_ctx_internel);
 92                                 
 93 /* key is not suitable for vairable*/                                
 94 #define BTSC_NEW_PROPERTY(key,value)    {\
 95                                             struct btsc_Property * _ppt =btsc_Property_Alloc(_ctx_internel,key,value);\
 96                                             btsc_Property_Append(_pkt,_ppt);\
 97                                         }
 98 #define BTSC_PACKET_END()        btsc_Pack(_ctx_internel,_pkt,btsc_NULL,0);\
 99                                 btsc_Packet_Free(_pkt);\
100                                 }
101 
102 #define BTSC_FOREACH(packet,ppt)    {\
103                                     int n;\
104                                     for(n=0;n<packet->size;n++){\
105                                         ppt = packet->properties[n];
106 #define BTSC_END_FOREACH()            }\
107                                 }
108 
109 #endif
110 
111 


  1 
  2 
  3 /*
  4     name:            btsc
  5                     serial communicating  with bluetooth and app-user
  6     desc:            pair parameter codec
  7     
  8         packet=[ key:name,]
  9         
 10     implemented:     zhangbin 
 11     date:            2007-01-26
 12 */
 13 
 14 #include <stdio.h>
 15 #include <stdlib.h>
 16 #include <string.h>
 17 #ifdef _UNIX
 18 #include <unistd.h>
 19 #endif
 20 #include "btsc.h"
 21 #include "crc.h"
 22 
 23 #define CRC_DEFAULT_STRING "CRC=00000"
 24 #define PACKET_HEAD        '<'
 25 #define PACKET_TAIL        '>'
 26 #define PROPERTY_DELIMITER    ','
 27 #define PAIR_DELIMITER        '='
 28 //#define PAIR_DELIMITER        '$'
 29 #define ESCAPE_CHAR            '\\'
 30 
 31 
 32 int calcEscapleLength(char * str);
 33 char* escape_copy(char * dest,char * src);
 34 void trim_escape_copy(char * dest,char * src,int size);
 35 int  calcPacketLength(struct btsc_Packet* pkt);
 36 int    is_escape_char(char c);
 37 void parseProperty(struct btsc_Packet * pkt,char * s,char * e);
 38 void parsePacket(struct btsc_Context* ctx,char * s,char* e);
 39 char*     __memchr(char * s,char* e,char c);
 40 
 41 char escape_ch_table[]={PACKET_HEAD,PACKET_TAIL,PROPERTY_DELIMITER,PAIR_DELIMITER,ESCAPE_CHAR,'\0'};
 42 
 43 struct btsc_Packet*     btsc_Packet_Alloc(struct btsc_Context* ctx){    
 44     struct btsc_Packet * pt = malloc(sizeof(struct btsc_Packet));        
 45     pt->size = 0;
 46     pt->capacity = ctx->packet_cached_size;
 47     pt->properties=malloc(pt->capacity*sizeof(struct btsc_Property*));    
 48     pt->ctx = ctx;
 49     return pt;    
 50 }
 51 
 52 void    btsc_Packet_Free(struct btsc_Packet* pt){    
 53     struct btsc_Property** tmp;
 54     if!pt )     return ;
 55     tmp = pt->properties;
 56     while(pt->size--){
 57         btsc_Property_Free(*tmp++);                
 58     }        
 59     if( pt->properties){
 60         free(pt->properties);  
 61     }
 62     free(pt);
 63 }
 64 
 65 
 66 struct btsc_Property*    btsc_Property_Alloc(struct btsc_Context* ctx,char * name,char * value){
 67     struct btsc_Property * ppt;
 68 /*    printf("enter btsc_Property_Alloc()\n");*/
 69     ppt = malloc( sizeof( struct btsc_Property) );
 70     if(!ppt)    printf("error: malloc failed (s1)\n");
 71     ppt->name = malloc( strlen(name)+1);
 72     if!ppt->name ) printf("error: malloc failed (s2)\n");
 73     strcpy(ppt->name,name);    
 74     ppt->value = malloc( strlen(value)+1);
 75     if!ppt->value) printf("error: malloc failed (s3),str:%s, len: %d\n",value,strlen(value)+1);
 76     strcpy( ppt->value,value);
 77     return ppt;
 78 }
 79 
 80 void        btsc_Property_Free(struct btsc_Property* ppt){
 81     if!ppt )    return;
 82     free( ppt->name);
 83     free( ppt->value);
 84     free( ppt);
 85 }
 86 
 87 /* scan pointer array */
 88 struct btsc_Property*     btsc_Property_Get(struct btsc_Packet* pkt,char * name){
 89     int size;
 90     struct btsc_Property* ppt;
 91     size = pkt->size;
 92     while(size--){
 93         ppt = pkt->properties[size];
 94         if!strcmp( name, ppt->name ) ){
 95             return ppt;/*that's ok */
 96         }
 97     }
 98     return btsc_NULL;
 99 }
100 
101 /* low effeciency, memory allocation,more costs*/
102 void    btsc_Property_Append(struct btsc_Packet* pt,struct btsc_Property * ppt){
103     struct btsc_Property** tmpppt;
104     if( pt->size==pt->capacity){         
105         pt->capacity += pt->ctx->packet_cached_size;    
106         tmpppt = pt->properties;        
107         pt->properties = malloc( pt->capacity * sizeof( struct btsc_Property**) ); 
108         memcpy( pt->properties, tmpppt, pt->size * sizeof( struct btsc_Property**));
109         free( tmpppt); 
110     }
111     pt->properties[pt->size++]=ppt;    
112 }
113 
114 int     btsc_init(struct btsc_Context* ctx){    
115     ctx->packet_cached_size = 10;    
116     if( ctx->recv_cached_capacity==0){
117         ctx->recv_cached_capacity = 1024*2;    
118     }
119     ctx->recv_buff = malloc( ctx->recv_cached_capacity );
120     ctx->recv_size = 0;
121     ctx->crc_check = 1;
122     return btsc_TRUE;
123 }
124 
125 void     btsc_cleanup(struct btsc_Context* ctx){
126     free(ctx->recv_buff);    
127 }
128 
129 /*
130 **    name:    calcEscapleLength
131 **    desc:    計算含轉義字符串長度
132 */
133 int     calcEscapleLength(char * str){
134     int len;
135     char * pesc;
136     len = 0;    
137     while*str ){
138         pesc = escape_ch_table;
139         while*pesc ){
140             if*pesc==*str){
141                 len++;
142                 break;
143             }
144             pesc++;
145         }        
146         str++
147     }    
148     return len;
149 }
150 
151 
152 char* escape_copy(char * dest,char * src){
153     char * pesc;
154     while*src ){
155         pesc = escape_ch_table;
156         while*pesc ){
157             if*pesc==*src){
158                 *dest++=ESCAPE_CHAR;
159                 break;
160             }
161             pesc++;
162         }
163         *dest++=*src++;                
164     }    
165     return dest;    
166 }
167 
168 void trim_escape_copy(char * dest,char * src,int size){
169     int last_escape = btsc_FALSE;
170     while( size--){
171         if*src == ESCAPE_CHAR && last_escape != btsc_TRUE){        
172             last_escape = btsc_TRUE    ;
173             src++;
174             continue;
175         }
176         last_escape = btsc_FALSE;
177         *dest++=*src++;        
178     }
179 }
180 
181 int       calcPacketLength(struct btsc_Packet* pkt){
182     int len;
183     int size;
184     struct btsc_Property* ppt;    
185     len = 0;
186     size = pkt->size;
187     while( size--){
188         ppt = pkt->properties[size];    
189         len+=strlen(ppt->name)+strlen(ppt->value);    
190 
191         len+= calcEscapleLength(ppt->name);
192         len+= calcEscapleLength(ppt->value);    
193     }
194     len+= pkt->size*2+1
195     return  len;
196 }
197 
198 
199 int        btsc_Pack(struct btsc_Context*  ctx,struct btsc_Packet* pkt,unsigned char * obuff,int* osize){
200     struct btsc_Property* ppt;
201     int size;
202     int len;
203     unsigned char * buff;
204     char * pbuff;
205     len = calcPacketLength( pkt);
206     /*crc scott 2008.6.16*/
207     if( ctx->crc_check ){
208         len += strlen(CRC_DEFAULT_STRING)+1/*1 is ,*/
209     }
210     /*end crc*/
211     buff = malloc( len );
212     size = pkt->size;
213     pbuff = (char*)buff;
214     *pbuff++=PACKET_HEAD;    
215     /* crc */
216     if( ctx->crc_check ){
217         memcpy(pbuff,CRC_DEFAULT_STRING,strlen(CRC_DEFAULT_STRING));
218         *(pbuff+ strlen(CRC_DEFAULT_STRING))=PROPERTY_DELIMITER;
219         pbuff+=strlen(CRC_DEFAULT_STRING)+1;    
220     }
221     /*end crc*/
222     while( size--){
223         ppt = pkt->properties[size];    
224         pbuff = escape_copy(pbuff,ppt->name);
225         *pbuff++=PAIR_DELIMITER;
226         pbuff = escape_copy(pbuff,ppt->value);
227         if( size ){
228             *pbuff++=PROPERTY_DELIMITER;            
229         }
230     }
231     *pbuff = PACKET_TAIL;
232     /* calc crc sum*/
233     if( ctx->crc_check ){
234         uint16 sum ;
235         char sum_str[4+6];
236         char * crc;
237         sum = crc16_block(buff,pbuff-buff+1);
238         sprintf(sum_str,"CRC=%05d",sum); // must be five chars
239         crc = strstr(buff,CRC_DEFAULT_STRING);
240         memcpy(crc,sum_str,strlen(sum_str));
241     }
242     /*end crc*/
243     if( ctx->tx ){
244         ctx->tx(ctx,buff,len);
245     } 
246     if( obuff && *osize >=len){
247         memcpy( obuff, buff ,len);
248         *osize = len;
249     }
250 
251     free(buff);
252     return btsc_TRUE;    
253 }
254 
255 /* e not in range*/
256 char*     __memchr(char * s,char* e,char c){
257     while( s!=e){
258         if*== c){
259             return s;
260         }        
261         s++;
262     }
263     return btsc_NULL;
264 }
265 
266 int        is_escape_char(char c){
267     return btsc_FALSE;    
268 }
269 
270 /*
271     name: parseProperty
272     desc: 指定內存范圍中提取屬性  key=>value
273         搜索包含e
274     params:    
275         pkt    --    消息數據包
276         s    --    起始內存地址 
277         e    --    結束地址 ,
278 */
279 void parseProperty(struct btsc_Packet * pkt,char * s,char * e){
280     char * p1,*p2;
281     int n;
282     struct btsc_Property*    ppt;
283     p1 = s ;
284     p2 = e;
285 __REPEAT:    
286     p1 = __memchr(p1,e+1,PAIR_DELIMITER);
287     if( p1 ){
288         if*(p1-1== ESCAPE_CHAR ){
289             p1++;
290             goto __REPEAT;
291         }
292         ppt = malloc( sizeof( struct btsc_Property ));
293         n = p1-s;         
294         ppt->name = malloc( n+1 );
295         memset(ppt->name,0,n+1);        
296         trim_escape_copy(ppt->name,s,n);
297         
298         n =e-p1;
299         ppt->value = malloc( n+1);
300         memset(ppt->value,0,n+1);
301         trim_escape_copy(ppt->value,p1+1,n);
302         
303         btsc_Property_Append(pkt,ppt);
304     }
305 }
306 
307 /*
308 func: crc_check
309 brief: 對數據包進行crc完整性檢測
310     提取屬性 CRC,填充默認的crc校驗和 00000; 校驗; 比較
311     crc_check運行完畢, s,e區段的數據被污染(CRC 屬性被清除為"CRC=00000")
312 params:
313     pkt     解析出來的數據包 <MSG=XXX,MSG2=XXX2>
314     s        '<'
315     e        '<'
316 return:
317         btsc_TRUE/btsc_FALSE    
318     編碼時 CRC屬性必須放于屬性集的首部
319 */
320 
321 int crc_check(struct btsc_Packet * packet, char *s,char *e){
322     struct btsc_Property * ppt;
323     char * crc;
324     uint16 sum;
325     ppt = btsc_Property_Get(packet,"CRC");
326     if(!ppt){        
327         return -1// no crc sum
328     }
329     if( strlen( ppt->value) != strlen("00000")){
330         return -2;
331     }
332     sum= (uint16) atoi( ppt->value); // 
333     
334     //*e='\0'; // set for strstr() CRC must be existed
335     crc = strstr(s,"CRC");
336     /*substitute default crc sum*/
337     memcpy(crc,CRC_DEFAULT_STRING,strlen(CRC_DEFAULT_STRING));
338     if( sum!=crc16_block(s,e-s+1)){    /*<..> pass into crc */
339         return -3;    /* crc error*/
340     }
341     
342     return btsc_TRUE; 
343 }
344 
345 /*
346     name: parsePacket
347     desc:    分解指定內存到包結構
348             成功分解出包立刻回送到應用接收者 ( btsc_Context::notifier)
349     param:
350         s,e     內存地址 (處e)
351         s ='<'
352         e ='>'
353 ** 緩沖區還需進一步測試,包括緩沖區大小調節, 不完整協議包格式的容錯
354 */
355 void     parsePacket(struct btsc_Context* ctx,char * s,char* e){
356     char *p,*p1,*p2;
357     struct btsc_Packet * pkt;
358     if( e-<=1 ){
359         return ;
360     }
361     pkt = btsc_Packet_Alloc(ctx);
362     
363     p1 = s+1;
364     p2 = e-1;
365     p = p1;
366 __REPEAT:    
367     p = __memchr(p,e,PROPERTY_DELIMITER);
368     if( p ){
369         if*(p-1)==ESCAPE_CHAR){
370             p = p+1;
371             goto __REPEAT;
372         }
373         parseProperty(pkt,p1,p-1);
374         p1 = ++p;
375         goto __REPEAT;
376     }
377     /*allow one property reside in*/
378     parseProperty(pkt,p1,e-1);
379     /*2008.6.16 scott add crc check*/
380     if( ctx->crc_check ){
381         if( crc_check(pkt,s,e)==btsc_FALSE ){ /*crc check error*/
382             btsc_Packet_Free(pkt);    
383             return ;
384         }
385     }
386     /*end crc check*/
387     if( ctx->notifier ){
388         if(ctx->notifier(pkt)){ /* nonzero value, delete internal*/
389             btsc_Packet_Free(pkt);            
390         }
391     }else{
392        btsc_Packet_Free(pkt);    
393     }
394 }
395 
396 void    btsc_Parse(struct btsc_Context* ctx, char * data,int size){
397     int len ;
398 _RESTART:
399     while( size ){
400         len = ctx->recv_cached_capacity - ctx->recv_size;
401         if( len >0){ 
402             if( size <= len){
403                 len = size;
404                 size = 0;
405             }else{
406                 size-=len;
407             }
408             memcpy( ctx->recv_buff+ctx->recv_size,data,len);
409             ctx->recv_size+=len;
410             data+=len;
411         }    
412         
413         {
414             char * p1,*p2;            
415 _RESCAN:            
416             p1 = ctx->recv_buff;
417 _RESCAN_HEAD:             
418             p1 = __memchr(p1,ctx->recv_buff+ctx->recv_size,PACKET_HEAD);            
419             if!p1 ){ 
420                 ctx->recv_size =0;
421                 if( size ){
422                     goto _RESTART;
423                 }else{
424                     return ;//scott by 2007.06.15 add 
425                 }
426             }
427             if( p1>ctx->recv_buff && *(p1-1)==ESCAPE_CHAR){ /* "\<" */
428                 p1++;
429                 goto _RESCAN_HEAD;    
430             }
431             
432             /*move backward*/
433             ctx->recv_size -=(p1-ctx->recv_buff);
434             memmove(ctx->recv_buff,p1, ctx->recv_size);
435             p1=ctx->recv_buff;
436             p2 = p1+1;
437 _RESCAN_TAIL:            
438             p2 = __memchr(p2,ctx->recv_buff+ctx->recv_size,PACKET_TAIL);
439             if!p2 ){
440                 if( ctx->recv_size == ctx->recv_cached_capacity ){
441                     ctx->recv_size  = 0
442                 }
443                 goto _RESTART;
444             }
445             if*(p2-1== ESCAPE_CHAR ){
446                 p2++;
447                 goto _RESCAN_TAIL;    
448             }
449             
450             parsePacket(ctx,p1,p2);
451             ctx->recv_size -=p2-p1+1;
452             if( ctx->recv_size ){
453                 memmove(ctx->recv_buff,p2+1,ctx->recv_size);
454                 goto _RESCAN; 
455             }             
456         }        
457     }
458 }
459 
460 /*   debug */
461 #ifdef _DEBUG
462 void tx(unsigned char * data,int len);
463 void notifier(struct btsc_Packet* packet);
464 /*初始化上下文, tx=發送處理函數,notifier=接收函數*/
465 //struct btsc_Context c={tx:tx,notifier:notifier};
466 struct btsc_Context c={tx,notifier};
467 
468 /*測試數據接收并解析*/
469 void rx(unsigned char * buff,int len){    
470      char * msg="<MSG=HELLO,NAME=SCOTT>"
471                  "<MSG2=HELLO2,NAME2=SCOTT2>"
472                  "<MSG3=HELLO3,NAME3=SCOTT3>"/*simulating data*/
473     //int len = strlen(msg);
474     btsc_Parse(&c,buff,len);
475 }
476 /*發送處理過程*/
477 void tx(struct btsc_Context*  ctx,unsigned char * buff,int len){    
478     char *outmsg = malloc(1024*10);
479     memset(outmsg,0,1024*10);
480     memcpy(outmsg,buff,len);
481     printf("encode str: %s\n",outmsg);
482     free(outmsg);
483     btsc_Parse(&c,buff,len);
484 }
485 
486 void notifier(struct btsc_Packet* packet){
487     struct btsc_Property * ppt;
488     ppt = btsc_Property_Get(packet,"MSG");
489     if(ppt)
490         printf("property get: MSG=>%s\n",ppt->value);
491     /*遍歷包內屬性參數*/
492     BTSC_FOREACH(packet,ppt);
493     printf("packet: %s=>%s\n",ppt->name,ppt->value);
494     BTSC_END_FOREACH();
495 }
496 
497 int test_main(){
498     int r;
499     /*optional*/
500     c.recv_cached_capacity = 1024/*初始化接收緩沖區大小 byte*/
501     c.packet_cached_size = 5;    /*消息包緩沖屬性個數*/
502     btsc_init(&c);            /*上下文初始化*/
503     //c.crc_check = 0;
504     puts("test rx()");
505 //    rx();    /*接*/
506     puts("escape testing");    
507     do{
508         /*構造消息包,并完成發送*/
509         BTSC_PACKET_BEGIN(&c);
510         BTSC_NEW_PROPERTY("MSG","calling");
511 
512         BTSC_PACKET_END();    
513     //    usleep(1000*50);
514         printf(">>seq:%d\n",r);
515     }while(0);
516         
517     btsc_cleanup(&c);    
518     
519     return 0;
520 }
521 
522 
523 #endif
524 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美风情在线观看| 欧美成人免费va影院高清| 国产欧美一区在线| 国产美女一区二区| 国产亚洲欧美另类中文| 激情亚洲一区二区三区四区| 极品少妇一区二区三区| 亚洲高清资源| 亚洲一区二区精品视频| 欧美在线一二三四区| 久久国产手机看片| 女同一区二区| 99国产精品国产精品久久| 午夜激情久久久| 女女同性精品视频| 国产精品国产福利国产秒拍| 国产一区二区三区四区hd| 91久久在线观看| 亚洲自啪免费| 欧美精品国产| 欧美国产第二页| 欧美一区成人| 欧美成人一区二区三区在线观看 | 99精品国产一区二区青青牛奶| 一区二区日韩| 另类图片国产| 这里只有精品视频| 久久九九国产精品| 国产精品久久久久91| 亚洲国产成人精品久久| 亚洲网友自拍| 欧美国产亚洲视频| 亚洲欧洲视频在线| 欧美一区二区三区四区在线观看地址 | 午夜精品理论片| 91久久精品日日躁夜夜躁欧美 | 国产色综合网| 在线亚洲观看| 欧美国产日韩一区二区在线观看| 午夜宅男久久久| 欧美天堂亚洲电影院在线播放| 在线看片一区| 理论片一区二区在线| 亚洲男人的天堂在线| 欧美日韩免费高清| 亚洲精品日韩精品| 久热成人在线视频| 欧美一区二区视频97| 国产精品综合| 午夜在线观看免费一区| 99精品视频免费观看| 欧美高清视频在线观看| 在线观看日韩欧美| 久久久久成人精品| 亚洲欧美日韩国产一区二区三区 | 一个人看的www久久| 欧美**人妖| 久久琪琪电影院| 狠狠干综合网| 美女精品网站| 巨乳诱惑日韩免费av| 国产一区二区三区观看| 性色av一区二区三区红粉影视| 在线一区欧美| 国产精品高潮呻吟| 午夜精品在线看| 久久综合导航| 久久久久.com| 永久免费毛片在线播放不卡| 久久久久五月天| 欧美综合国产| 国产精品视频导航| 久久久久久亚洲精品中文字幕| 欧美在线视频一区二区三区| 激情视频一区二区三区| 欧美大尺度在线| 欧美激情bt| 欧美一二三区精品| 女人色偷偷aa久久天堂| 亚洲夫妻自拍| 亚洲午夜激情网站| 亚洲四色影视在线观看| 国产精品久在线观看| 午夜视频精品| 久久人体大胆视频| 亚洲一区二区三区中文字幕| 午夜精品久久久久久久久| 在线观看精品| 99人久久精品视频最新地址| 国产精品资源在线观看| 欧美风情在线观看| 欧美三级欧美一级| 美女91精品| 国产精品高潮在线| 免费一级欧美片在线播放| 欧美日韩一区高清| 亚洲视屏在线播放| 欧美中文字幕视频| 国产综合视频| 亚洲一级在线| 亚洲乱码日产精品bd| 国产精品美女主播在线观看纯欲| 久久激情五月婷婷| 欧美国产三级| 欧美资源在线| 欧美日韩国产在线播放| 久久亚洲图片| 国产精品自拍视频| 亚洲精品久久久久久下一站| 国产日产欧美a一级在线| 91久久久久久久久| 韩国av一区二区三区四区| 夜夜爽av福利精品导航| 亚洲激情视频网站| 久久精品99久久香蕉国产色戒| 欧美日韩亚洲91| 久久这里有精品15一区二区三区| 久久久91精品国产一区二区三区| 欧美电影在线免费观看网站 | 国产精品一区二区男女羞羞无遮挡| 久久免费精品日本久久中文字幕| 一区二区三区日韩欧美精品| 亚洲一品av免费观看| 久久全国免费视频| 久久久人成影片一区二区三区| 欧美视频专区一二在线观看| 亚洲国产精品免费| 激情欧美日韩一区| 亚洲免费视频成人| 午夜一区二区三区在线观看| 噜噜噜噜噜久久久久久91 | 国产一区二区三区在线免费观看 | 一区二区亚洲精品| 午夜国产精品影院在线观看| 亚洲综合精品四区| 国产精品免费一区二区三区观看| 91久久精品一区| 亚洲国产视频a| 免费亚洲一区| 亚洲国产精品电影| 伊人精品在线| 免费在线日韩av| 亚洲国产日本| 9人人澡人人爽人人精品| 免费人成精品欧美精品| 欧美大片一区| 亚洲国产成人精品女人久久久 | 亚洲欧美在线一区二区| 久久久人成影片一区二区三区观看| 国产专区一区| 免费在线欧美黄色| 亚洲精品永久免费| 亚洲一区二区三区久久| 国产欧美日韩精品一区| 久久久久久午夜| 亚洲第一福利视频| 9久草视频在线视频精品| 国产精品毛片| 久久一区二区三区国产精品 | 亚洲一区亚洲| 久久一区国产| 亚洲日韩中文字幕在线播放| 欧美日韩国产区| 午夜精品久久久久久久久| 欧美黑人在线播放| 99精品久久久| 国产日韩欧美在线看| 久久网站热最新地址| 亚洲精品影视| 老司机午夜精品视频在线观看| 亚洲精品久久久久久久久| 国产精品久久久久久久久果冻传媒| 欧美中文在线字幕| 狠狠色丁香久久婷婷综合_中| 亚洲日韩中文字幕在线播放| 国产日韩一级二级三级| 免费成人网www| 日韩亚洲欧美一区二区三区| 欧美在线一区二区| 99热精品在线| 一区二区三区在线视频播放| 欧美日韩三区| 欧美成人激情在线| 欧美专区福利在线| 亚洲桃花岛网站| 91久久在线播放| 免费观看成人www动漫视频| 亚洲在线观看| 一区二区毛片| 91久久中文字幕| 国产欧美精品一区二区三区介绍| 久久先锋影音av| 欧美一区二区三区视频在线| 日韩亚洲欧美一区二区三区| 亚洲第一毛片| 老司机午夜精品视频| 久久av一区二区| 午夜精品福利视频| 在线亚洲一区观看| 亚洲美女诱惑|