《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > 玩轉iPhone網絡通訊之BSD Socket篇
玩轉iPhone網絡通訊之BSD Socket篇
摘要: 在進行iPhone網絡通訊程序的開發中,不可避免的要利用Socket套接字。iPhone提供了Socket網絡編程的接口CFSocket,不過筆者更喜歡使用BSDSocket。
Abstract:
Key words :

  在進行iPhone網絡通訊程序的開發中,不可避免的要利用Socket套接字。iPhone提供了Socket網絡編程的接口CFSocket,不過筆者更喜歡使用BSD Socket。

  iPhone BSD Socket進行編程所需要的頭文件基本都位于/Xcode3.1.4/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/include/sys下,既然本篇文章作為基礎篇,那么筆者就從最基本的知識講解開始。

  首先,Socket是進行程序間通訊(IPC, Internet Process Connection)的BSD方法,這意味著Socket是用來讓一個進程和其他的進程互相通訊的,就像我們用電話來和其他人交流一樣。

  既然說Socket像個電話,那么如果要打電話首先就要安裝一部電話,“安裝電話”這個動作對BSD Socket來說就是初始化一個Socket,方法如下:

  int socket(int, int, int);

  第一個int參數為Socket的地址方式,既然要“安裝電話”,那么就要首先確認所要安裝的電話是音頻的還是脈沖的。而如果要給BSD Socket安裝電話,有兩種類型可供讀者選擇:AF_UNIX和AF_INET,它們代表Socket的地址格式。如果選擇AF_UNIX,意味著需要為Socket提供一個類似Unix路徑的名稱,這個選項主要用于本地程序之間的socket通訊;本文主要講解網絡通訊,所以需要選擇參數AF_INET。

  第二個int參數為Socket的類型,“安裝電話”需要首先確定是裝有線的還是裝無線的,安裝Socket也一樣,在Socket中提供了兩種類型:SOCK_STREAM和SOCK_DGRAM。SOCK_STREAM表明數據像字符流一樣通過Socket;而SOCK_DGRAM則表明數據以數據報(Datagrams)的形式通過Socket,本文主要講解SOCK_STREAM,因為它的使用更為廣泛。

  第三個int參數為所使用的協議,本文里使用0即可。

  “安裝電話”的代碼如下:

  if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

  {

  perror(“socket”);

  exit(1);

  }

  到現在為止,怎么安裝電話已經清楚了。因為本文主要演示如何在iPhone上使用BSD Socket獲取內容,更多的功能是“打電話”而不是“接電話”,所以下面主要講解BSD Socket扮演“客戶端”角色的操作。

  既然要“打電話”,那么首先要有打電話的對象,更確切的說需要一個“電話號碼”,BSD Socket中的“電話號碼”就是IP地址。更糟糕的情況是,如果只知道聯系人的名字而不知道電話號碼,那么還需要程序查找相應聯系人的電話號碼,根據聯系人姓名查找電話號碼的過程在BSD Socket中叫做DNS解析,代碼如下:

  - (NSString*)getIpAddressForHost:(NSString*) theHost

  {

  struct hostent *host = gethostbyname([theHost UTF8String]);

  if(!host)

  {

  herror(“resolv”);

  return NULL;

  }

  struct in_addr **list = (struct in_addr **)host-》h_addr_list;

  NSString *addressString = [NSString stringWithCString:inet_ntoa(*list[0])];

  return addressString;

  }

  hostent是個結構體,使用它需要#import 《netdb.h》,通過這個方法得到theHost域名的第一個有效的IP地址并返回。

  正確的“找到電話號碼”后,就需要“撥打電話”了,代碼如下:

  their_addr.sin_family = AF_INET;

  their_addr.sin_addr.s_addr = inet_addr([[self getIpAddressForHost:hostName] UTF8String]);

  NSLog(@“getIpAddressForHost :%@”,[self getIpAddressForHost:hostName]);

  their_addr.sin_port = htons(80);

  bzero(&(their_addr.sin_zero), 8);

  int conn = connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr));

  NSLog(@“Connect errno is :%d”,conn);

  在進行iPhone網絡通訊程序的開發中,不可避免的要利用Socket套接字。iPhone提供了Socket網絡編程的接口CFSocket,不過筆者更喜歡使用BSD Socket。

  iPhone BSD Socket進行編程所需要的頭文件基本都位于/Xcode3.1.4/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/include/sys下,既然本篇文章作為基礎篇,那么筆者就從最基本的知識講解開始。

  首先,Socket是進行程序間通訊(IPC, Internet Process Connection)的BSD方法,這意味著Socket是用來讓一個進程和其他的進程互相通訊的,就像我們用電話來和其他人交流一樣。

  既然說Socket像個電話,那么如果要打電話首先就要安裝一部電話,“安裝電話”這個動作對BSD Socket來說就是初始化一個Socket,方法如下:

  int socket(int, int, int);

  第一個int參數為Socket的地址方式,既然要“安裝電話”,那么就要首先確認所要安裝的電話是音頻的還是脈沖的。而如果要給BSD Socket安裝電話,有兩種類型可供讀者選擇:AF_UNIX和AF_INET,它們代表Socket的地址格式。如果選擇AF_UNIX,意味著需要為Socket提供一個類似Unix路徑的名稱,這個選項主要用于本地程序之間的socket通訊;本文主要講解網絡通訊,所以需要選擇參數AF_INET。

  第二個int參數為Socket的類型,“安裝電話”需要首先確定是裝有線的還是裝無線的,安裝Socket也一樣,在Socket中提供了兩種類型:SOCK_STREAM和SOCK_DGRAM。SOCK_STREAM表明數據像字符流一樣通過Socket;而SOCK_DGRAM則表明數據以數據報(Datagrams)的形式通過Socket,本文主要講解SOCK_STREAM,因為它的使用更為廣泛。

  第三個int參數為所使用的協議,本文里使用0即可。

  “安裝電話”的代碼如下:

  if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

  {

  perror(“socket”);

  exit(1);

  }

  到現在為止,怎么安裝電話已經清楚了。因為本文主要演示如何在iPhone上使用BSD Socket獲取內容,更多的功能是“打電話”而不是“接電話”,所以下面主要講解BSD Socket扮演“客戶端”角色的操作。

  既然要“打電話”,那么首先要有打電話的對象,更確切的說需要一個“電話號碼”,BSD Socket中的“電話號碼”就是IP地址。更糟糕的情況是,如果只知道聯系人的名字而不知道電話號碼,那么還需要程序查找相應聯系人的電話號碼,根據聯系人姓名查找電話號碼的過程在BSD Socket中叫做DNS解析,代碼如下:

  - (NSString*)getIpAddressForHost:(NSString*) theHost

  {

  struct hostent *host = gethostbyname([theHost UTF8String]);

  if(!host)

  {

  herror(“resolv”);

  return NULL;

  }

  struct in_addr **list = (struct in_addr **)host-》h_addr_list;

  NSString *addressString = [NSString stringWithCString:inet_ntoa(*list[0])];

  return addressString;

  }

  hostent是個結構體,使用它需要#import 《netdb.h》,通過這個方法得到theHost域名的第一個有效的IP地址并返回。

  正確的“找到電話號碼”后,就需要“撥打電話”了,代碼如下:

  their_addr.sin_family = AF_INET;

  their_addr.sin_addr.s_addr = inet_addr([[self getIpAddressForHost:hostName] UTF8String]);

  NSLog(@“getIpAddressForHost :%@”,[self getIpAddressForHost:hostName]);

  their_addr.sin_port = htons(80);

  bzero(&(their_addr.sin_zero), 8);

  int conn = connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr));

  NSLog(@“Connect errno is :%d”,conn);

  筆者最初試圖采用NHost進行主機域名的解析,奈何iPhone的這個類為private的,在application的開發中不可使用。

  如果“電話”能順利的接通,那么就可以進行“講話”了,反之則會斷開“電話連接”,如果友好的話,最好能給個提示,諸如“您所撥打的電話不在服務區之類”:)

  if(conn != -1)

  {

  NSLog(@“Then the conn is not -1!”);

  NSMutableString* httpContent = [self makeHttpHeader:hostName];

  NSLog(@“httpCotent is :%@”,httpContent);

  if(contentSended != nil)

 ?。踙ttpContent appendFormat:contentSended];

  NSLog(@“Sended content is :%@”,httpContent);

  NSData *data = [httpContent dataUsingEncoding:NSISOLatin1StringEncoding];

  ssize_t dataSended = send(sockfd, [data bytes], [data length], 0);

  if(dataSended == [data length])

  {

  NSLog(@“Datas have been sended over!”);

  }

  printf(“send %d bytes to %s\n”,dataSended,inet_ntoa(their_addr.sin_addr));

  NSMutableString* readString = [[NSMutableString alloc] init];

  char readBuffer[512];

  int br = 0;

  while((br = recv(sockfd, readBuffer, sizeof(readBuffer), 0)) 《 sizeof(readBuffer))

  {

  NSLog(@“read datas length is :%d”,br);

 ?。踨eadString appendFormat:[NSString stringWithCString:readBuffer length:br]];

  NSLog(@“Hava received datas is :%@”,readString);

  }

  close(sockfd);

  }else {

  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[@“Connection failed to host ” stringByAppendingString:hostName] message:@“Please check the hostname in the preferences.” delegate:self cancelButtonTitle:@“OK” otherButtonTitles:nil];

 ?。踑lert show];

 ?。踑lert release];

  }

  “講話”通過send(),“聽話”通過recv(),這個兩個函數的原型如下:

  int send(int sockfd, const void *msg, int len, int flags);

  int recv(int sockfd,void *buf,int len,unsigned int flags);

  可以看出,這兩個函數的參數基本相同。

  第一個參數為套接字的句柄。

  第二個參數為數據緩沖區。

  第三個參數為數據長度。

  最后一個參數有點特殊,這個參數是為了讓BSD Socket能支持“帶外數據”,何謂“帶外數據”?顧名思義,就是“帶內以外的數據”,而帶內數據就是常規的按照Socket字節流順序進行傳遞的數據。通常情況下,數據由連接的一端流到接收的一端,并且認為數據的所有字節都是精確排序的,晚寫入的字節絕不會早于先寫入的字節到達。但是如果我們“掛斷了電話”,而接收方還有大量已經被接收的緩沖數據,這些數據還沒被程序讀取,那么接收方需要在讀取這些緩沖的“帶內數據”之前先讀取一個標識取消的請求,這個請求就可以利用帶外請求的方法進行傳送。請求帶外數據傳送需要把標識位置為MSG_OOB,如下:

  char buf[64];

  int len;

  int s;

  …

  send(s,buf,len,MSG_OOB);

  至此,一個完整的“通話過程”已經結束,最后別忘記調用close(sockfd)“掛斷電話”。

  下面筆者嘗試請求www.baidu.com的首頁,并把請求的頁面內容打印到控制臺,所以需要對請求進行封裝,以支持HTTP協議。很簡單,只需要在請求的內容前面加上相應的HTTP頭信息即可,如下:

  #define HTTPMETHOD @“GET”

  #define HTTPVERSION @“HTTP/1.1”

  #define HTTPHOST @“Host”

  #define KENTER @“\r\n”

  #define KBLANK @“ ”

  - (NSMutableString*) makeHttpHeader:(NSString*) hostName

  {

  NSMutableString *header = [[NSMutableString alloc] init];

  [header appendFormat:HTTPMETHOD];

 ?。踙eader appendFormat:KBLANK];

 ?。踙eader appendFormat:@“/index.html”];

 ?。踙eader appendFormat:KBLANK];

  [header appendFormat:HTTPVERSION];

 ?。踙eader appendFormat:KENTER];

 ?。踙eader appendFormat:HTTPHOST];

 ?。踙eader appendFormat:@“:”];

 ?。踙eader appendFormat:hostName];

  [header appendFormat:KENTER];

 ?。踙eader appendFormat:KENTER];

  return header;

  }

  在上面的方法中,筆者封裝了HTTP頭信息,對HTTP不熟悉的同學可以先熟悉熟悉HTTP的格式,請求到的內容打印如下:

 ?。跾ession started at 2009-11-12 15:40:02 +0800.]

  2009-11-12 15:40:04.691 BSDHttpExample[3483:207] getIpAddressForHost :119.75.216.30

  2009-11-12 15:40:04.725 BSDHttpExample[3483:207] Connect errno is :0

  2009-11-12 15:40:04.727 BSDHttpExample[3483:207] Then the conn is not -1!

  2009-11-12 15:40:04.735 BSDHttpExample[3483:207] httpCotent is :GET /index.html HTTP/1.1

  Host:www.baidu.com

  2009-11-12 15:40:04.736 BSDHttpExample[3483:207] Sended content is :GET /index.html HTTP/1.1

  Host:www.baidu.com

  2009-11-12 15:40:04.736 BSDHttpExample[3483:207] Datas have been sended over!

  send 48 bytes to 119.75.216.30

  2009-11-12 15:40:04.764 BSDHttpExample[3483:207] read datas length is :363

  2009-11-12 15:40:04.765 BSDHttpExample[3483:207] Hava received datas is :HTTP/1.1 200 OK

  Date: Thu, 12 Nov 2009 07:40:05 GMT

  Server: BWS/1.0

  Content-Length: 3520

  Content-Type: text/html;charset=gb2312

  Cache-Control: private

  Expires: Thu, 12 Nov 2009 07:40:05 GMT

  Set-Cookie: BAIDUID=9B024266ADD3B52AC8367A2BDD1676E5:FG=1; expires=Thu, 12-Nov-39 07:40:05 GMT; path=/; domain=.baidu.com

  P3P: CP=“ OTI DSP COR IVA OUR IND COM ”

  2009-11-12 15:40:04.766 BSDHttpExample[3483:207] view has been loaded!

  最后為了造福大家,筆者附上完整的代碼,頭文件如下:

  //

  // BSDHttpExampleViewController.h

  // BSDHttpExample

  //

  // Created by sun dfsun2009 on 09-11-12.

  // Copyright __MyCompanyName__ 2009. All rights reserved.

  //

  #import 《UIKit/UIKit.h》

  #define MYPORT 4880

  #import 《stdio.h》

  #import 《stdlib.h》

  #import 《unistd.h》

  #import 《arpa/inet.h》

  #import 《sys/types.h》

  #import 《sys/socket.h》

  #import 《netdb.h》

  @interface BSDHttpExampleViewController : UIViewController {

  int sockfd;

  struct sockaddr_in their_addr;

  }

  @end

  實現文件如下:

  //

  // BSDHttpExampleViewController.m

  // BSDHttpExample

  //

  // Created by sun dfsun2009 on 09-11-12.

  // Copyright __MyCompanyName__ 2009. All rights reserved.

  //

  #import “BSDHttpExampleViewController.h”

  @implementation BSDHttpExampleViewController

  #define HTTPMETHOD @“GET”

  #define HTTPVERSION @“HTTP/1.1”

  #define HTTPHOST @“Host”

  #define KENTER @“\r\n”

  #define KBLANK @“ ”

  /*

  // The designated initializer. Override to perform setup that is required before the view is loaded.

  - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

  if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {

  // Custom initialization

  }

  return self;

  }

  */

  /*

  // Implement loadView to create a view hierarchy programmatically, without using a nib.

  - (void)loadView {

  }

  */

  void error_handle(char *errorMsg)

  {

  fputs(errorMsg, stderr);

  fputc(‘\n’,stderr);

  exit(1);

  }

  - (NSMutableString*) makeHttpHeader:(NSString*) hostName

  {

  NSMutableString *header = [[NSMutableString alloc] init];

 ?。踙eader appendFormat:HTTPMETHOD];

 ?。踙eader appendFormat:KBLANK];

 ?。踙eader appendFormat:@“/index.html”];

  [header appendFormat:KBLANK];

 ?。踙eader appendFormat:HTTPVERSION];

  [header appendFormat:KENTER];

 ?。踙eader appendFormat:HTTPHOST];

 ?。踙eader appendFormat:@“:”];

  [header appendFormat:hostName];

 ?。踙eader appendFormat:KENTER];

  [header appendFormat:KENTER];

  return header;

  }

  - (NSString*)getIpAddressForHost:(NSString*) theHost

  {

  struct hostent *host = gethostbyname([theHost UTF8String]);

  if(!host)

  {

  herror(“resolv”);

  return NULL;

  }

  struct in_addr **list = (struct in_addr **)host-》h_addr_list;

  NSString *addressString = [NSString stringWithCString:inet_ntoa(*list[0])];

  return addressString;

  }

  - (void)Connect:(NSString *)hostName content:(NSString *)contentSended

  {

  if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

  {

  perror(“socket”);

  exit(1);

  }

  //NSHost *host = [NSHost hostWithName:hostName];

  //if(host)

  //{

  their_addr.sin_family = AF_INET;

  //their_addr.sin_addr.s_addr = inet_addr([[host address] UTF8String]);

  their_addr.sin_addr.s_addr = inet_addr([[self getIpAddressForHost:hostName] UTF8String]);

  NSLog(@“getIpAddressForHost :%@”,[self getIpAddressForHost:hostName]);

  their_addr.sin_port = htons(80);

  bzero(&(their_addr.sin_zero), 8);

  int conn = connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr));

  NSLog(@“Connect errno is :%d”,conn);

  if(conn != -1)

  {

  NSLog(@“Then the conn is not -1!”);

  NSMutableString* httpContent = [self makeHttpHeader:hostName];

  NSLog(@“httpCotent is :%@”,httpContent);

  if(contentSended != nil)

  [httpContent appendFormat:contentSended];

  NSLog(@“Sended content is :%@”,httpContent);

  NSData *data = [httpContent dataUsingEncoding:NSISOLatin1StringEncoding];

  ssize_t dataSended = send(sockfd, [data bytes], [data length], 0);

  if(dataSended == [data length])

  {

  NSLog(@“Datas have been sended over!”);

  }

  printf(“send %d bytes to %s\n”,dataSended,inet_ntoa(their_addr.sin_addr));

  NSMutableString* readString = [[NSMutableString alloc] init];

  char readBuffer[512];

  int br = 0;

  while((br = recv(sockfd, readBuffer, sizeof(readBuffer), 0)) 《 sizeof(readBuffer))

  {

  NSLog(@“read datas length is :%d”,br);

 ?。踨eadString appendFormat:[NSString stringWithCString:readBuffer length:br]];

  NSLog(@“Hava received datas is :%@”,readString);

  }

  close(sockfd);

  }else {

  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[@“Connection failed to host ” stringByAppendingString:hostName] message:@“Please check the hostname in the preferences.” delegate:self cancelButtonTitle:@“OK” otherButtonTitles:nil];

 ?。踑lert show];

 ?。踑lert release];

  }

  /*

  }

  else

  {

  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[@“Could not look up host ” stringByAppendingString:hostName] message:@“Please check the hostname in the preferences.” delegate:self cancelButtonTitle:@“OK” otherButtonTitles:nil];

 ?。踑lert show];

 ?。踑lert release];

  }

  **/

  }

  - (void)Send:(id)sender

  {

  char message[7] = “aaag”;

  send(sockfd,message,sizeof(message),0);

  NSLog(@“%s”,message);

  }

  // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

  - (void)viewDidLoad {

 ?。踫elf Connect:@“www.baidu.com” content:nil];

  [super viewDidLoad];

  NSLog(@“view has been loaded!”);

  }

  /*

  // Override to allow orientations other than the default portrait orientation.

  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

  // Return YES for supported orientations

  return (interfaceOrientation == UIInterfaceOrientationPortrait);

  }

  */

  - (void)didReceiveMemoryWarning {

  // Releases the view if it doesn‘t have a superview.

  [super didReceiveMemoryWarning];

  // Release any cached data, images, etc that aren’t in use.

  }

  - (void)viewDidUnload {

  // Release any retained subviews of the main view.

  // e.g. self.myOutlet = nil;

  }

  - (void)dealloc {

 ?。踫uper dealloc];

  }

  @end

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美搞黄网站| 亚洲一区二区久久| 国产精品麻豆欧美日韩ww| 国内成+人亚洲+欧美+综合在线| 亚洲精品一二| 蜜桃av久久久亚洲精品| 亚洲日本中文字幕免费在线不卡| 欧美在线综合视频| 国产伪娘ts一区| 欧美亚洲第一页| 欧美精品电影在线| 欧美日韩精品不卡| 老司机午夜精品视频在线观看| 一本一本久久a久久精品综合麻豆| 国产精品一区二区三区观看| 欧美国产国产综合| 一区二区三区视频在线| 亚洲成色精品| 欧美日韩八区| 欧美一区高清| 在线一区二区三区四区五区| 国产精品海角社区在线观看| 国产精品一区二区女厕厕| 激情综合电影网| 欧美午夜精彩| 韩国亚洲精品| 亚洲黄色性网站| 国产精品家庭影院| 亚洲欧美卡通另类91av| 国产在线欧美日韩| 国产免费亚洲高清| 亚洲午夜精品久久久久久浪潮| 欧美成人四级电影| 久久久久久高潮国产精品视| 老司机午夜精品视频| 国产欧美精品一区二区色综合| 亚洲视频一区二区免费在线观看| 亚洲欧美国产精品桃花| 欧美va亚洲va日韩∨a综合色| 久久久久久久尹人综合网亚洲| 国产精品视频99| 国产精品日韩欧美| 久久九九免费视频| 国产亚洲va综合人人澡精品| 欧美成人免费观看| 日韩一区二区高清| 欧美一区二区三区喷汁尤物| 麻豆成人91精品二区三区| 午夜亚洲福利| 麻豆精品视频在线观看视频| 欧美精品一区二区高清在线观看| 欧美国产日本高清在线| 国产精品少妇自拍| 国产精品黄页免费高清在线观看| 精品成人国产在线观看男人呻吟| 国产亚洲视频在线观看| 欧美视频在线一区二区三区| 久久免费少妇高潮久久精品99| 欧美日韩在线影院| 噜噜爱69成人精品| 国产一区二区毛片| 亚洲视频网在线直播| 亚洲东热激情| 亚洲欧洲综合另类在线| 久久久www| 久久久夜夜夜| 国产亚洲综合性久久久影院| 久久国产精品久久久久久电车| 亚洲国产精品va在线看黑人动漫| 欧美伊久线香蕉线新在线| 在线观看91精品国产麻豆| 欧美日韩国产综合视频在线观看| 免费成人网www| 欲香欲色天天天综合和网| 久久精品中文字幕一区二区三区| 伊人久久av导航| 国产精品麻豆欧美日韩ww| 久久aⅴ国产紧身牛仔裤| 韩国亚洲精品| 欧美激情1区| 一区二区三区欧美激情| 国产一区二区三区四区在线观看| 亚洲精品日韩激情在线电影| 伊人久久亚洲热| 国产精品免费看久久久香蕉| 这里只有视频精品| 日韩亚洲不卡在线| 久久激情视频免费观看| 国产精品视频一| 蜜桃伊人久久| 9色国产精品| 欧美日韩另类字幕中文| 亚洲精品视频啊美女在线直播| 国内精品模特av私拍在线观看| 国产日韩欧美| 99热这里只有精品8| 国产精品欧美日韩一区二区| 久久久91精品国产| 亚洲欧洲日本一区二区三区| 日韩网站在线观看| 久久频这里精品99香蕉| 亚洲女人av| 夜夜夜精品看看| 亚洲黄色天堂| 亚洲国产日日夜夜| 午夜精品久久久久久久男人的天堂| 亚洲国产精品一区在线观看不卡| 另类天堂视频在线观看| 欧美日产一区二区三区在线观看| 亚洲黄色天堂| 亚洲国产精品国自产拍av秋霞| 欧美亚州一区二区三区| 久久成人精品| 欧美成人精品在线| 欧美~级网站不卡| 亚洲国产精品t66y| 91久久国产精品91久久性色| 亚洲欧美国产不卡| 欧美日韩三区| 欧美日韩一区二区精品| 欧美成人综合网站| 欧美特黄a级高清免费大片a级| 欧美日韩精品国产| 国产色婷婷国产综合在线理论片a| 亚洲精品视频在线播放| 亚洲永久网站| 欧美成人在线网站| 国产精品二区三区四区| 欧美看片网站| 国产精品永久| 国户精品久久久久久久久久久不卡| 午夜精品视频网站| 国产日产高清欧美一区二区三区| 欧美亚洲免费电影| 欧美精品一区二区三区视频| 欧美日韩成人精品| 国产精品国产三级国产a| 亚洲已满18点击进入久久| 国产伦精品一区二区三区四区免费| 亚洲国产天堂久久综合| 国产一区二三区| 亚洲大片在线观看| 久久高清免费观看| 国产精品海角社区在线观看| 亚洲麻豆一区| 国产午夜精品美女视频明星a级| 国产精品入口日韩视频大尺度| 欧美性色视频在线| 久久国产欧美日韩精品| 国产精品久久婷婷六月丁香| 亚洲国产精品99久久久久久久久| 在线观看欧美一区| 亚洲精品国产欧美| 国产精品中文字幕欧美| 久久精品一区二区三区不卡牛牛| 亚洲乱码国产乱码精品精天堂| 国产欧美一区二区精品婷婷| 国产自产女人91一区在线观看| 午夜精品久久99蜜桃的功能介绍| 久久精品国产清高在天天线| 久久综合色天天久久综合图片| 中文一区二区在线观看| 欧美日韩国语| 久久黄色影院| 亚洲欧美日韩天堂一区二区| 男女视频一区二区| 欧美中文在线观看| 亚洲国产精品专区久久| 欧美视频免费在线观看| 亚洲男女自偷自拍图片另类| 欧美一区二区视频在线| 香蕉久久夜色精品国产| 欧美尤物巨大精品爽| 欧美精品免费在线观看| 欧美在线黄色| 欧美日韩国产一中文字不卡| 国产日产精品一区二区三区四区的观看方式| 亚洲一本大道在线| 欧美一区二区三区婷婷月色| 麻豆av福利av久久av| 欧美日韩国产综合久久| 夜夜嗨av一区二区三区| 欧美在线视频免费观看| 久久一区欧美| 一区二区在线观看av| 亚洲视频播放| 久久精品99无色码中文字幕| 欧美日韩一区二区三区视频| 欧美精品少妇一区二区三区| 极品日韩av| 午夜久久电影网| 欧美啪啪一区| 久久另类ts人妖一区二区| 欧美三级视频在线播放| 国产一区99| 久久躁日日躁aaaaxxxx| 久久一区中文字幕| 欧美亚洲日本国产| 一区二区三区精品视频| 国产一区二区久久精品| 蜜桃久久精品一区二区| 亚洲四色影视在线观看| 欧美一区在线直播| 欧美日韩在线三区| 亚洲激情中文1区| 欧美视频一区二区三区| 日韩视频在线观看一区二区| 亚洲丰满少妇videoshd| 亚洲精品乱码久久久久久按摩观| 亚洲线精品一区二区三区八戒| 国产精品播放| 久久久免费观看视频| 亚洲午夜伦理| 欧美精品91| 欧美精品一区二区三区久久久竹菊| 久久久久**毛片大全| 亚洲深夜福利视频| av成人免费| 国产欧美精品一区二区色综合| 禁断一区二区三区在线| 亚洲国产精品传媒在线观看| 欧美88av| 欧美精品一区二区三区在线播放| 国产视频一区在线观看| 欧美日韩国产片| 国产精品色午夜在线观看| 久久青青草原一区二区| 亚洲欧洲在线一区| 国产日韩欧美电影在线观看| 亚洲宅男天堂在线观看无病毒| 正在播放亚洲一区| 亚洲一区二区三区午夜| 欧美在线视频免费观看| 欧美视频国产精品| 国产欧亚日韩视频| 欧美日韩亚洲一区二区三区在线观看| 久久动漫亚洲| 欧美视频不卡| 欧美日韩精品在线观看| 99re6热只有精品免费观看| 伊人精品视频| 亚洲性感美女99在线| 亚洲激情小视频| 午夜精品免费在线| 欧美日韩亚洲综合在线| 欧美一二三区在线观看| 亚洲国产天堂久久综合网| 亚洲二区在线视频| 欧美日韩一区二区三区免费| 欧美sm重口味系列视频在线观看| 国产麻豆日韩欧美久久| 欧美四级剧情无删版影片| 亚洲激情黄色| 欧美激情一区二区三区全黄| 亚洲一区二区三区在线观看视频| 欧美日本在线看| 久久久久91| 娇妻被交换粗又大又硬视频欧美| 久久精品男女| 国产精品久久国产精品99gif| 狠狠色狠狠色综合人人| 欧美日韩在线大尺度| 亚洲夜晚福利在线观看| 久久久久久久久久看片| 欧美激情视频一区二区三区在线播放| 夜夜嗨av一区二区三区网页| 久久成人一区二区| 欧美体内she精视频| 国产一区二区三区视频在线观看| 午夜精品影院| 日韩视频免费观看| 亚洲精品国精品久久99热| 欧美电影在线观看| 欧美日韩亚洲高清| 久久久久久有精品国产| 亚洲伦理精品| 亚洲天堂成人在线观看| 国产午夜精品久久久久久久| 欧美亚洲自偷自偷| 亚洲专区在线视频| 欧美性猛交一区二区三区精品| 国产喷白浆一区二区三区| 亚洲高清精品中出| 亚洲国产精品热久久| 国产精品美女久久久久久2018| 国产网站欧美日韩免费精品在线观看| 久久久久久91香蕉国产| 欧美无乱码久久久免费午夜一区| 国产免费成人| 亚洲一区国产| 国产一区91精品张津瑜| 国产欧美一区二区精品性| 久久综合色影院| 99pao成人国产永久免费视频| 亚洲精品一区二区三区樱花| 国产精品成人免费视频| 亚洲校园激情| 欧美激情片在线观看| 国产伦精品一区二区三| 欧美不卡激情三级在线观看| 亚洲福利视频二区| 亚洲国产一二三| 午夜精品久久久久久久久久久| 国产精品毛片在线看| 亚洲综合国产激情另类一区| 久久久久久久综合色一本| 夜夜嗨av一区二区三区四季av| 欧美日韩ab片| 国产一区导航| 欧美一级二区| 国产欧美日韩在线视频| 日韩亚洲国产欧美| 亚洲亚洲精品三区日韩精品在线视频| 亚洲国产精品久久| 日韩午夜激情| 极品裸体白嫩激情啪啪国产精品| 国产伦精品一区二区| 欧美国产日韩一区二区在线观看| 欧美三级视频| 欧美日韩亚洲视频| 欧美v亚洲v综合ⅴ国产v| 欧美激情1区| 一区二区激情小说| 国产精品卡一卡二卡三| 欧美午夜性色大片在线观看| 久久精品亚洲一区二区| 国产精品国产成人国产三级| 亚洲在线观看视频网站|