《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > 玩轉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)

  [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);

  [readString 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];

  [alert show];

  [alert 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];

  [header appendFormat:KBLANK];

  [header appendFormat:@“/index.html”];

  [header appendFormat:KBLANK];

  [header appendFormat:HTTPVERSION];

  [header appendFormat:KENTER];

  [header appendFormat:HTTPHOST];

  [header appendFormat:@“:”];

  [header appendFormat:hostName];

  [header appendFormat:KENTER];

  [header appendFormat:KENTER];

  return header;

  }

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

  [Session 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];

  [header appendFormat:HTTPMETHOD];

  [header appendFormat:KBLANK];

  [header appendFormat:@“/index.html”];

  [header appendFormat:KBLANK];

  [header appendFormat:HTTPVERSION];

  [header appendFormat:KENTER];

  [header appendFormat:HTTPHOST];

  [header appendFormat:@“:”];

  [header appendFormat:hostName];

  [header 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);

  [readString 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];

  [alert show];

  [alert 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];

  [alert show];

  [alert 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 {

  [self 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 {

  [super dealloc];

  }

  @end

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 天天插天天爱 | 日本精品少妇一区二区三区 | 成人免费视频久久 | 三级免费毛片 | 午夜之声l性8电台lx8电台 | 两个女人互添下身爱爱 | 中文免费av | 人善交video另类hd侏儒 | 日韩精品一卡2卡3卡4卡乱码的功能 | 成人18夜夜网深夜福利网 | 极品少妇一区二区三区 | 欧美深夜福利视频 | 亚洲涩涩视频 | 国产午夜精品av一区二区 | 国产精品久久久久久久久电影网 | 四虎国产精品成人 | 91福利视频在线观看 | www久久久精品 | www奇米影视com| 921国产乱码久久久久久 | 亚洲伊人久久大香线蕉综合图片 | 中日韩美中文字幕av一区 | 久草福利资源站 | 多p混交群体交乱小说h | 播播激情网 | 91精品国产一区二区三区蜜臀 | 精品偷自拍另类在线观看 | 国产精品一色哟哟哟 | 色婷婷久久一区二区三区麻豆 | 天堂av手机在线 | 日日操日日摸 | 好吊妞国产欧美日韩免费观看网站 | 狠狠干影院 | 婷婷影院在线观看 | 亚洲黄色一区二区 | 夜夜导航 | 日韩极品视频 | 7777奇米四色成人眼影 | 亚洲午夜久久久久久久久电影网 | 久久久精品一区二区三区 | 国产ts在线| www.欧美在线 | 麻豆久久久久 | 久久精品国产清高在天天线 | 日韩一区二区三区在线视频 | 国产高潮视频在线观看 | 一区二区精彩视频 | 深夜视频一区二区 | 成人美女黄网站色大免费的 | 亚洲综合精品香蕉久久网 | 久久人人妻人人爽人人爽 | 国产精品最新 | 亚洲色土 | 欧美三级视频 | 国产伦精品一区二区三区视频免费 | 亚洲无人区一区二区三区 | 国产肉体xxx裸体312大胆 | 国产精品一区二区三区在线 | 最近免费中文字幕 | 亚洲另类激情专区小说图片 | 亚洲欧美综合一区二区三区 | 91精品情国产情侣高潮对白文档 | 亚洲欧美日韩精品久久 | 国产刺激的三3p交换视频 | 我要色综合网 | 极品在线播放 | 国产乱女淫av麻豆国产 | 精品久久久精品 | 日韩aⅴ视频 | 特级淫片裸体免费看视频 | 欧美a网 | 欧美成人黄 | 麻豆果冻传媒2021精品传媒一区下载 | 内射毛片内射国产夫妻 | 超碰狠狠操 | 青青青青青手机视频在线观看视频 | 肉丝袜脚交视频一区二区 | 777精品伊人久久久久大香线蕉 | 国产香蕉精品 | 国产做爰全免费的视频软件 | 遮羞美女bbbbb洗澡视频 | 美女扒开奶罩露出奶头视频网站 | 一级影片在线观看 | 国产一毛片 | www成人精品免费网站青椒 | 日韩视频网址 | 久久亚洲一区二区三区成人国产 | 狠狠干天天爱 | 一区二区三区四区精品 | 性欧美videos另类hd | 一区二区三区国产在线 | 欧美二区乱c黑人 | 在线视频亚洲色图 | 亚洲成a人 | 国产一区调教91鞭打 | 蜜桃臀av一区二区三区 | 亚洲免费永久精品国产 | 国产麻豆网 | 日韩一级片免费观看 | 国产女女做受ⅹxx高潮 | 精品久久久爽爽久久男人和男人 | 在线免费观看麻豆 | 日本无遮挡边做边爱边摸 | 亚洲性久久9久久爽 | 日本6一12娇小xxxⅹhd | 色婷婷亚洲一区二区三区 | 大黑人交xxxx18视频 | 成人国产精品视频国产 | 国产一区二区在线免费 | 国产农村乱子伦精品视频 | 国产欧美一区二区精品性 | 超碰av在线播放 | 国产又粗又长又黄视频 | 亚洲综合区 | 欧美日本道 | 中文字幕一区二区三区精华液 | 在线资源站 | 2019精品手机国产品在线 | 中文字幕久久熟女蜜桃 | 欧美成人在线视频 | 国产又粗又硬又黄的视频 | 法国啄木系列成人av | 极品新婚夜少妇真紧 | 国产精品美女久久久久久久久 | 亚洲国产成人精品女人久久久野战 | 日韩精品中文字幕一区 | 男人午夜剧场 | 国产三级韩国三级日本带黄 | 婷婷久久综合 | 国产理伦 | 欧美午夜性春猛交xxxx明星 | 亚洲免费精品网站 | 福利逼站 | 国产精品盗摄!偷窥盗摄 | 国产精品亚洲视频 | jvid视频| 日韩精品欧美在线 | 日本精品一区二区在线观看 | 黄色男女 黄色a几 | 亚洲乱码国产乱码精品精大量 | 丰满少妇人妻无码专区 | 女同三级bd高清在线播放 | 无码乱码av天堂一区二区 | 婷婷一级片 | 超碰97在线播放 | 国产精品久久久久久亚洲影视公司 | 在线观看视频福利 | 毛片av在线观看 | 国产成人av无码精品 | 毛片一二三区 | 青青草综合| 亚洲精品国偷拍自产在线观看蜜桃 | 狠狠操2019 | 在线观看aaa | 屁屁影院第一页 | 久久久久久一级片 | 绯色av蜜臀一区二区中文字幕 | 国产又爽又黄又刺激的视频 | 女厕厕露p撒尿八个少妇 | 好紧好湿好黄的视频 | 欧洲做受高潮免费看 | 日本老妇做爰xxx视频 | 国产精品久久久一区二区 | 日本一区二区三区高清在线观看 | 懂色av蜜臀av粉嫩av喷吹 | 精品中文字幕一区二区三区av | 久久国产乱子伦精品免费午夜,浪货好紧 | 91av国产精品 | 无套内射视频囯产 | 亚洲成人免费在线 | 性开放按摩bbwbbw视频 | 97超碰免费观看 | 乱淫交换粗大多p | 91在线| 国产亚洲精久久久久久无码 | 麻豆网站免费观看 | 97色伦图片| 毛片网站免费观看 | 97se狠狠狠狠狼鲁亚洲综合色 | 精品乱子伦一区二区三区 | 日韩国产亚洲欧美 | 无码人妻精品一区二区蜜桃色欲 | 性xxxx18| 欧美精品91| 国产94在线 | 亚洲 | 91黄在线看 | 最近的中文字幕在线看视频 | 国模丽丽啪啪一区二区 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产一级揄自揄精品视频 | 久久亚洲欧美国产精品 | 国产一卡二卡在线播放 | 99爱在线视频这里只有精品 | 久久黄色免费视频 | 久人久人久人久久久久人 | 四虎影视永久在线观看 | 日本大尺度床戏揉捏胸 | 艳妇av| 久久精品入口九色 | 亚洲中文字幕在线无码一区二区 | 欧美成人免费在线观看 | 欧美俄罗斯乱妇 | 激情综合网站 | 在线视频精品中文无码 | 美女天天操| 野外做受又硬又粗又大视频 | 在线中文视频 | 91麻豆精品国产91久久久久久久久 | 欧美性受xxxx黒人xyx性爽 | 日日日日做夜夜夜夜做无码 | 中文字幕一区二区在线播放 | 国模吧无码一区二区三区 | 久久99青青精品免费观看 | 蜜臀av性久久久蜜臀av流畅 | 久久国产精品99国产精 | 蜜桃精品成人影片 | 亚洲精品久久久久中文第一暮 | 日韩欧美中文字幕一区二区三区 | 男女性杂交内射女bbwxz | 欧美真人性野外做爰 | 精品夜夜嗨av一区二区三区 | 天天综合天天做天天综合 | 国产1区2区在线观看 | 图片区 小说区 区 亚洲五月 | 黄瓜视频91 | 亚洲精品视频在线 | 中文字幕另类 | 玩弄丰满少妇xxxxx性多毛 | 午夜精品久久久久久久四虎美女版 | 国产欧美日韩在线播放 | 中文字幕天堂在线 | 国产一精品久久99无吗一高潮 | 日韩成人极品在线内射3p蜜臀 | 亚洲成av人的天堂在线观看 | 99xav| 久久青青国产 | 久久精品99国产国产精 | 国产裸体永久免费无遮挡 | 精品乱码一区二区三区四区 | 欧美视频在线免费看 | 亚洲国产精品女人 | 亚洲色图视频在线观看 | 国产性生活视频 | 韩日成人| 成人免费看片又大又黄 | 18禁在线永久免费观看 | 人人妻人人澡人人爽欧美一区九九 | 超碰啪啪 | 亚洲日本乱码在线观看 | 日韩第一视频 | 亚洲麻豆一区 | 少妇放荡的呻吟干柴烈火动漫 | 免费人妻av无码专区 | 亚洲色图综合在线 | 国产精品丝袜黑色高跟鞋v18 | 二区国产| 欧美性xxxxx极品娇小 | 热re99久久精品国产99热 | 中文字幕第1页第69 中文字幕第22页 | 欧美日韩亚洲国产综合 | 香港黄a三级三级三级看三级 | 免费看h网站 | 国产在线一二三 | 亚洲国产精品成人久久 | 亚洲精品在线观 | 不卡中文 | 蜜臀va亚洲va欧美va天堂 | 精品国产一区二区三区久久久蜜臀 | 久久日韩乱码一二三四区别 | 亚洲国产成人av | 亚洲国产婷婷 | 亚洲www啪成人一区二区 | 国产又色又爽又黄刺激在线视频 | 欧美jiizzhd精品欧美 | 天堂av官网 | 麻豆av一区二区三区 | 日本国产一区二区三区 | 亚洲欧洲免费无码 | 午夜羞羞影院男女爽爽爽 | 一区二区三区日韩 | 国产麻豆精品久久一二三 | 一本大道久久香蕉成人网 | 本道久久 | 在线看日本| 爱爱激情免费视频 | 欧美日韩成人在线观看 | 中文字幕488页在线 中文字幕58页 | 国产成人亚洲人欧洲 | 国产人妻人伦精品1国产盗摄 | 免费不卡的av | 99久久久无码国产精品不卡 | 国产午夜一级一片免费播放 | 日本xxxx色视频在线观看免费 | 国产九九九九九 | 丁香六月天婷婷 | 九七九色丨麻豆 | 中文字幕久久爽aⅴ一区 | 黄色免费高清 | 欧美熟妇另类久久久久久多毛 | 久久精品视频久久 | 国产日产欧产精品精品首页 | 黑人好猛厉害爽受不了好大撑 | 美国成人av| 亚洲麻豆av| 日韩特级片 | 天天色欧美 | 欧美午夜精品久久久久免费视 | 欧美在线看片a免费观看 | 一级中文片 | 毛片一二三区 | 亚洲人交乣女bbw | 在线播放少妇奶水过盛 | 日韩放荡少妇无码视频 | 亚洲国产精品一区二区第一页 | 日韩在线视频观看 | 精品国产不卡一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 外国黄色毛片 | 国产成人精品亚洲线观看 | www天天色| 麻豆精品91| 一道本在线观看 | 狠狠一区 | 国产精品综合久久久精品综合蜜臀 | 国产粉嫩高中好第一次不戴 | 国产亚洲欧美精品久久久www | 日本高清二区 | 久久久国产一区二区三区 | 黑人一级黄色片 | 中文字幕丰满孑伦无码专区 | 国产精品久久天堂噜噜噜 | 激情久久五月天 | 日批网址 | 亚洲色精品三区二区一区 | 爱情岛论坛网亚洲品质 | 91丝袜超薄交口足 | 亚洲精品网址 | 精品不卡一区二区 | 亚洲成熟少妇 | 日韩欧美在线一区二区 | 亚洲一区av无码少妇电影 | 亚洲免费网站观看视频 | 欧美成人在线免费 | 无码人妻丰满熟妇啪啪 | 日韩欧美中文字幕在线观看 | 奇米777四色影视在线看 | 成人性生生活性生交免费 | 中文在线日本 | 97久久爽久久爽爽久久片 | 50路60路老熟妇啪啪 | 爱情岛论坛成人永久网站在线观看 | 91精品国产91久久综合 | 日韩淫视频 | a毛片在线 | 国产一级一片 | 大尺度福利视频 | 国产手机在线αⅴ片无码观看 | 亚洲国产欧美日本视频 | 亚洲精品久久久久999中文字幕 | 女人18毛片毛片毛片毛片区二 | 中文在线а√在线 | 天天摸日日干 | 无遮挡边吃摸边吃奶边做 | 欧美在线| 欧美一级免费观看 | 一级免费黄色毛片 | 日韩日日夜夜 | 亚洲理论电影在线观看 | 国产精品日韩欧美一区二区 | 免费国产黄网站在线观看视频 | 中文字幕有码在线观看 | 亚洲免费中文字幕 | 加勒比一本heyzo高清视频 | 亚洲九九色 | 欧美亚洲精品suv一区 | 亚洲色成人www永久在线观看 | 美女露出给别人摸图片 | 一区二区在线免费看 | 人成亚洲 | 性欧美ⅹxxxx极品少妇小说 | 日本肉感丰满bbw | 国内成人自拍视频 | 久久国产劲爆∧v内射 | 精品推荐国产精品店 | 国产精品7m凸凹视频分类 | 亚洲中文无码a∨在线观看 在线不卡日本v二区到六区 | 午夜色av| 上原亚衣加勒比在线播放 | 少妇人妻在线视频 | 在线观看三级网站 | 黄色一毛片| 免费无码又黄又爽又刺激 | 国产福利一区二区三区在线观看 | 国产精品永久久久久久久久久 | 日本va欧美va欧美va精品 | 欧美特一级片 | 黄色三级国产 | 国产一级片av大片 | 国产精品夜夜春夜夜爽久久小 | 伊甸园成人入口 | 国产黄色毛片视频 | 俄罗斯丰满熟妇hd | 日韩av一二三区 | 欧美激情精品久久 | 日日夜夜精品视频免费 | 欧美视频在线观看免费 | 91啪视频在线观看 | 欧美yyy| 亚洲学生妹高清av | 色琪琪丁香婷婷综合久久 | 麻豆成人久久精品综合网址 | 牲高潮99爽久久久久777 | 亚洲www啪成人一区二区麻豆 | 日韩精品一区二区中文字幕 | 久久久久久久久久久久久久久久久久 | 天堂网www网在线最新版 | 激情综合亚洲 | 色欲久久久天天天综合网 | 在线蜜桃| 亚洲国产人午在线一二区 | 日韩欧美精品中文字幕 | 狠狠躁天天躁无码中文字幕 | 在线观看人成视频免费 | 国产88久久久国产精品免费二区 | 国产在线看黄 | 亚洲精品影院在线观看 | 91超碰在线免费观看 | 国产精久久久 | 久久久欧美国产精品人妻噜噜 | 欧美人体做爰大胆视频 | 精品无码久久久久久国产 | 午夜精品一区二区三区三上悠亚 | 美女视频黄a视频免费全程软件axs | 亚洲第一网站在线观看 | 国产大片中文字幕在线观看 | 国产精品一国产精品 | 亚洲天堂成人 | 亚洲www永久成人夜色 | 91精品国产自产91精品 | 男女又爽又黄 | 中文字幕在线色 | 男人的天堂一区二区 | 又粗又大又黄又硬又爽免费看 | 4hu亚洲人成人无码网www电影首页 | 善良的公与媳hd中文字 | 久久精品老司机 | 一本色道久久综合无码人妻 | 五月婷婷综合激情网 | 国产综合色在线视频区 | 黄瓜视频在线播放 | 国产精品无码av不卡 | 韩国毛片视频 | 日韩欧美手机在线 | ass亚洲日本嫩体私拍ass | 九一亚色视频 | 国产欧美一区二区精品久导航 | 久久精品人妻无码一区二区三区 | 免费特级黄毛片 | 欧美一性一乱一交一视频 | 亚洲熟妇无码av | 人妖和人妖互交性xxxx视频 | 色综亚洲国产vv在线观看 | 国产精品污www在线观看 | 国产日产欧产精品浪潮的免费功能 | 国产av仑乱内谢 | 国产成人一区二区三区视频免费 | 亚洲精品国产精品乱码不99 | 女人18毛片水真多 | 日本久久精品一区二区三区 | av一本二本 | 含紧一点h边做边走动免费视频 | 中文区中文字幕免费看 | 一区二区三区视频免费看 | av手机免费看 | 精品视频免费 | 成人影片一区免费观看 | 久久蜜桃精品一区二区三区综合网 | 国产一区二区三区成人欧美日韩在线观看 | 在线免费观看福利 | 久草福利| 伊人影院视频 | 92成人午夜福利一区二区 | 日本在线激情 | 在线成人国产 | 极品女神爆呻吟啪啪 | 极品美女极度色诱视频在线 | 国产精品成人一区二区三区视频 | 日韩av毛片| 国产香蕉视频在线播放 | 国产美女作爱视频 | 中文字幕乱码在线人视频 | 无码国产精品一区二区免费i6 | 国产欧美一区二区三区另类精品 | 97免费公开在线视频 | 亚洲国产一线 | 嫩草影院在线观看91麻豆 | 野花社区www视频最新资源 | 性——交——性——乱免费的 | 国产真人无码作爱视频免费 | 亚洲视频在线免费看 | 亚洲精品lv| 天天摸天天舔 | 人人妻人人澡人人爽秒播 | 波多野结衣精品在线 | 一级片久久 | 国产精品国产三级国产不产一地 | 国产精品制服诱惑 | 黄色a在线 | 日本精品巨爆乳无码大乳巨 | 国产91脚交调教 | 国产精品资源一区二区 | 亚洲 中文 欧美 日韩 在线 | 久久99国产综合精品免费 | 欧美日韩国产一级 | 免费在线观看小视频 | va亚洲va欧美va国产综合 | 后人极品翘臀美女在线播放 | 色哟哟在线免费观看 | 香蕉成人在线视频 | 天天拍夜夜添久久精品 | 激情 小说 亚洲 图片 伦 | 国产95在线 | 亚洲 | 最近最好的中文字幕2019免费 | 日本成人免费在线 | 99精品视频在线观看 | 最新免费av| 邻居少妇张开腿让我爽了一夜 | 欧美性猛交xxxx久久久 | 中文字幕第68页 | 亚洲欧美一区二区三区不卡 | 亚洲一区二区在线免费 | 日韩不卡 | 欧美性猛交xxx嘿人猛交 | 在线天堂中文在线资源网 | 国产免费99 | 亚洲国产精品高潮呻吟久久 | 国产精品久久久久久久成人午夜 | 99年国精产品一二二区传媒 | 大尺度激情吻胸视频 | 国产中文字幕一区二区 | 无遮挡啪啪摇乳动态图gif | 亚洲精品成人福利网站 | 丁香天五香天堂综合 | 亚洲一区视频 | 国产成人精品福利 | av在线片 | 天天拍天天色 | 亚洲成av人乱码色午夜 | 免费av在线播放网址 | 天堂亚洲免费视频 | 久久久久久久岛国免费网站 | 欧美性猛交丰臀xxxxx网站 | 欧美一区亚洲二区 | 51妺嘿嘿午夜福利 | 香蕉久久夜色精品升级完成 | 亚洲一本大道无码av天堂 | 清草视频| 免费亚洲精品 | 少妇无码av无码一区 | 男女国产精品 | 奶罩不戴乳罩邻居hd播放 | 狠狠色狠狠色综合日日92 | 黄色免费av网站 | 亚洲第一天堂网 | 视频国产一区 | 日韩国产免费 | 红桃视频一区二区三区免费 | 国产午夜精品在线 | 黄色工厂在线观看 | 日韩黄视频在线观看 | 欧美激情精品久久久久久蜜臀 | 无套在线观看 | 欧洲三级视频 | 他掀开裙子舌头进去69式 | 精品国产一区二区三区四区vr | 理论片87福利理论电影 | 插插操操 | 国产日韩精品视频一区二区三区 | 奶大臀圆magnet少妇 | 97国产资源| 在线视频第一页 | 国产在线麻豆精品观看 | 日韩精品色 | 在线毛片观看 | 91精品老司机久久一区啪 | 中文字幕亚洲精品在线 | 亚洲最大黄色 | 婷婷丁香五月天综合东京热 | 久久精品久久久久久久久久久久久 | 一本色道综合久久欧美日韩精品 | 国产乱人伦精品一区二区 | 老头与老头性ⅹxx视频 | 亚洲国产天堂一区二区三区 | 蜜臀久久99精品久久久无需会员 | 99精品国产自在现线10页 | 99久久人人爽亚洲精品美女 | 久久se精品一区精品二区 | 国产经典自拍 | 农村老熟妇乱子伦视频 | 真实偷拍激情啪啪对白 | 麻豆免费在线视频 | www.999zyz.com| 女人夜夜春精品a片 | 国产精品一二三四五 | 亚洲精品午夜 | 玖玖精品在线视频 | 成年在线网站免费观看无广告 | 亚洲精品tv久久久久久久久久 | 国产色播av在线 | 欧美日韩在线观看成人 | 久久中文网 | 免费成人黄色av | 久久精品国产欧美日韩 | 99精品国产在热久久 | 粉嫩av一区二区三区入口 |