亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務(wù)器 > Linux服務(wù)器 > 正文

Linux進(jìn)程間通信方式之socket使用實(shí)例

2024-09-05 23:04:18
字體:
供稿:網(wǎng)友

套接字是一種通信機(jī)制,憑借這種機(jī)制,客戶/服務(wù)器系統(tǒng)的開發(fā)工作既可以在本地單機(jī)上進(jìn)行,也可以跨網(wǎng)絡(luò)進(jìn)行。
套接字的特性有三個(gè)屬性確定,它們是:域(domain),類型(type),和協(xié)議(protocol)。套接字還用地址作為它的名字。地址的格式隨域(又被稱為協(xié)議族,protocol family)的不同而不同。每個(gè)協(xié)議族又可以使用一個(gè)或多個(gè)地址族定義地址格式。

1.套接字的域

域指定套接字通信中使用的網(wǎng)絡(luò)介質(zhì)。最常見的套接字域是AF_INET,它是指Internet網(wǎng)絡(luò),許多Linux局域網(wǎng)使用的都是該網(wǎng)絡(luò),當(dāng)然,因特網(wǎng)自身用的也是它。其底層的協(xié)議——網(wǎng)際協(xié)議(IP)只有一個(gè)地址族,它使用一種特定的方式來指定網(wǎng)絡(luò)中的計(jì)算機(jī),即IP地址。

在計(jì)算機(jī)系統(tǒng)內(nèi)部,端口通過分配一個(gè)唯一的16位的整數(shù)來表示,在系統(tǒng)外部,則需要通過IP地址和端口號(hào)的組合來確定。

2.套接字類型

流套接字(在某些方面類似域標(biāo)準(zhǔn)的輸入/輸出流)提供的是一個(gè)有序,可靠,雙向字節(jié)流的連接。

流套接字由類型SOCK_STREAM指定,它們是在AF_INET域中通過TCP/IP連接實(shí)現(xiàn)的。他們也是AF_UNIX域中常見的套接字類型。

數(shù)據(jù)包套接字

與流套接字相反,由類型SOCK_DGRAM指定的數(shù)據(jù)包套接字不建立和維持一個(gè)連接。它對(duì)可以發(fā)送的數(shù)據(jù)包的長度有限制。數(shù)據(jù)報(bào)作為一個(gè)單獨(dú)的網(wǎng)絡(luò)消息被傳輸,它可能會(huì)丟失,復(fù)制或亂序到達(dá)。

數(shù)據(jù)報(bào)套接字實(shí)在AF_INET域中通過UDP/IP連接實(shí)現(xiàn),它提供的是一種無需的不可靠服務(wù)。

3.套接字協(xié)議

只要底層的傳輸機(jī)制允許不止一個(gè)協(xié)議來提供要求的套接字類型,我們就可以為套接字選擇一個(gè)特定的協(xié)議。

先上一個(gè)代碼

服務(wù)端:

//s_unix.c #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h>  #define UNIX_DOMAIN "/tmp/UNIX.domain" int main(void) {   socklen_t clt_addr_len;   int listen_fd;   int com_fd;   int ret;   int i;   static char recv_buf[1024];    int len;   struct sockaddr_un clt_addr;   struct sockaddr_un srv_addr;   listen_fd=socket(PF_UNIX,SOCK_STREAM,0);   if(listen_fd<0)   {     perror("cannot create communication socket");     return 1;   }    //set server addr_param   srv_addr.sun_family=AF_UNIX;   strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);   unlink(UNIX_DOMAIN);   //bind sockfd & addr   ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));   if(ret==-1)   {     perror("cannot bind server socket");     close(listen_fd);     unlink(UNIX_DOMAIN);     return 1;   }   //listen sockfd    ret=listen(listen_fd,1);   if(ret==-1)   {     perror("cannot listen the client connect request");     close(listen_fd);     unlink(UNIX_DOMAIN);     return 1;   }   //have connect request use accept   len=sizeof(clt_addr);   com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);   if(com_fd<0)   {     perror("cannot accept client connect request");     close(listen_fd);     unlink(UNIX_DOMAIN);     return 1;   }   //read and printf sent client info   printf("/n=====info=====/n");   for(i=0;i<4;i++)   {     memset(recv_buf,0,1024);     int num=read(com_fd,recv_buf,sizeof(recv_buf));     printf("Message from client (%d)) :%s/n",num,recv_buf);    }   close(com_fd);   close(listen_fd);   unlink(UNIX_DOMAIN);   return 0; } 

客戶端:

//c_unix.c#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#define UNIX_DOMAIN "/tmp/UNIX.domain"int main(void){  int connect_fd;  int ret;  char snd_buf[1024];  int i;  static struct sockaddr_un srv_addr;//creat unix socket  connect_fd=socket(PF_UNIX,SOCK_STREAM,0);  if(connect_fd<0)  {    perror("cannot create communication socket");    return 1;  }    srv_addr.sun_family=AF_UNIX;  strcpy(srv_addr.sun_path,UNIX_DOMAIN);//connect server  ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));  if(ret==-1)  {    perror("cannot connect to the server");    close(connect_fd);    return 1;  }  memset(snd_buf,0,1024);  strcpy(snd_buf,"message from client");//send info server  for(i=0;i<4;i++)    write(connect_fd,snd_buf,sizeof(snd_buf));  close(connect_fd);  return 0;}

使用套接字除了可以實(shí)現(xiàn)網(wǎng)絡(luò)間不同主機(jī)間的通信外,還可以實(shí)現(xiàn)同一主機(jī)的不同進(jìn)程間的通信,且建立的通信是雙向的通信。socket進(jìn)程通信與網(wǎng)絡(luò)通信使用的是統(tǒng)一套接口,只是地址結(jié)構(gòu)與某些參數(shù)不同。

一、創(chuàng)建socket流程

(1)創(chuàng)建socket,類型為AF_LOCAL或AF_UNIX,表示用于進(jìn)程通信:

創(chuàng)建套接字需要使用 socket 系統(tǒng)調(diào)用,其原型如下:

int socket(int domain, int type, int protocol);

其中,domain 參數(shù)指定協(xié)議族,對(duì)于本地套接字來說,其值須被置為 AF_UNIX 枚舉值;type 參數(shù)指定套接字類型,protocol 參數(shù)指定具體協(xié)議;type 參數(shù)可被設(shè)置為 SOCK_STREAM(流式套接字)或 SOCK_DGRAM(數(shù)據(jù)報(bào)式套接字),protocol 字段應(yīng)被設(shè)置為 0;其返回值為生成的套接字描述符。

對(duì)于本地套接字來說,流式套接字(SOCK_STREAM)是一個(gè)有順序的、可靠的雙向字節(jié)流,相當(dāng)于在本地進(jìn)程之間建立起一條數(shù)據(jù)通道;數(shù)據(jù)報(bào)式套接字(SOCK_DGRAM)相當(dāng)于單純的發(fā)送消息,在進(jìn)程通信過程中,理論上可能會(huì)有信息丟失、復(fù)制或者不按先后次序到達(dá)的情況,但由于其在本地通信,不通過外界網(wǎng)絡(luò),這些情況出現(xiàn)的概率很小。

二、命名socket。

SOCK_STREAM 式本地套接字的通信雙方均需要具有本地地址,其中服務(wù)器端的本地地址需要明確指定,指定方法是使用 struct sockaddr_un 類型的變量。

struct sockaddr_un {  sa_family_t   sun_family;   /* AF_UNIX */  char  sun_path[UNIX_PATH_MAX];    /* 路徑名 */};

這里面有一個(gè)很關(guān)鍵的東西,socket進(jìn)程通信命名方式有兩種。一是普通的命名,socket會(huì)根據(jù)此命名創(chuàng)建一個(gè)同名的socket文件,客戶端連接的時(shí)候通過讀取該socket文件連接到socket服務(wù)端。這種方式的弊端是服務(wù)端必須對(duì)socket文件的路徑具備寫權(quán)限,客戶端必須知道socket文件路徑,且必須對(duì)該路徑有讀權(quán)限。

另外一種命名方式是抽象命名空間,這種方式不需要?jiǎng)?chuàng)建socket文件,只需要命名一個(gè)全局名字,即可讓客戶端根據(jù)此名字進(jìn)行連接。后者的實(shí)現(xiàn)過程與前者的差別是,后者在對(duì)地址結(jié)構(gòu)成員sun_path數(shù)組賦值的時(shí)候,必須把第一個(gè)字節(jié)置0,即sun_path[0] = 0,下面用代碼說明:

第一種方式:

//name the server socket 	server_addr.sun_family = AF_UNIX;	strcpy(server_addr.sun_path,"/tmp/UNIX.domain");	server_len = sizeof(struct sockaddr_un);	client_len = server_len;

第二種方式:

#define SERVER_NAME @socket_server 
//name the socket   server_addr.sun_family = AF_UNIX;   strcpy(server_addr.sun_path, SERVER_NAME);   server_addr.sun_path[0]=0;   //server_len = sizeof(server_addr);   server_len = strlen(SERVER_NAME) + offsetof(struct sockaddr_un, sun_path);

其中,offsetof函數(shù)在#include <stddef.h>頭文件中定義。因第二種方式的首字節(jié)置0,我們可以在命名字符串SERVER_NAME前添加一個(gè)占位字符串,例如:

#define SERVER_NAME @socket_server  

前面的@符號(hào)就表示占位符,不算為實(shí)際名稱。

提示:客戶端連接服務(wù)器的時(shí)候,必須與服務(wù)端的命名方式相同,即如果服務(wù)端是普通命名方式,客戶端的地址也必須是普通命名方式;如果服務(wù)端是抽象命名方式,客戶端的地址也必須是抽象命名方式。

三、綁定

SOCK_STREAM 式本地套接字的通信雙方均需要具有本地地址,其中服務(wù)器端的本地地址需要明確指定,指定方法是使用 struct sockaddr_un 類型的變量,將相應(yīng)字段賦值,再將其綁定在創(chuàng)建的服務(wù)器套接字上,綁定要使用 bind 系統(tǒng)調(diào)用,其原形如下:

int bind(int socket, const struct sockaddr *address, size_t address_len);

其中 socket表示服務(wù)器端的套接字描述符,address 表示需要綁定的本地地址,是一個(gè) struct sockaddr_un 類型的變量,address_len 表示該本地地址的字節(jié)長度。實(shí)現(xiàn)服務(wù)器端地址指定功能的代碼如下(假設(shè)服務(wù)器端已經(jīng)通過上文所述的 socket 系統(tǒng)調(diào)用創(chuàng)建了套接字,server_sockfd 為其套接字描述符):

struct sockaddr_un server_address;server_address.sun_family = AF_UNIX;strcpy(server_address.sun_path, "Server Socket");bind(server_sockfd, (struct sockaddr*)&server_address, sizeof(server_address));

客戶端的本地地址不用顯式指定,只需能連接到服務(wù)器端即可,因此,客戶端的 struct sockaddr_un 類型變量需要根據(jù)服務(wù)器的設(shè)置情況來設(shè)置,代碼如下(假設(shè)客戶端已經(jīng)通過上文所述的 socket 系統(tǒng)調(diào)用創(chuàng)建了套接字,client_sockfd 為其套接字描述符):

struct sockaddr_un client_address;client_address.sun_family = AF_UNIX;strcpy(client_address.sun_path, "Server Socket");

四、監(jiān)聽

服務(wù)器端套接字創(chuàng)建完畢并賦予本地地址值(名稱,本例中為Server Socket)后,需要進(jìn)行監(jiān)聽,等待客戶端連接并處理請(qǐng)求,監(jiān)聽使用 listen 系統(tǒng)調(diào)用,接受客戶端連接使用accept系統(tǒng)調(diào)用,它們的原形如下:

int listen(int socket, int backlog);int accept(int socket, struct sockaddr *address, size_t *address_len);

其中 socket 表示服務(wù)器端的套接字描述符;backlog 表示排隊(duì)連接隊(duì)列的長度(若有多個(gè)客戶端同時(shí)連接,則需要進(jìn)行排隊(duì));address 表示當(dāng)前連接客戶端的本地地址,該參數(shù)為輸出參數(shù),是客戶端傳遞過來的關(guān)于自身的信息;address_len 表示當(dāng)前連接客戶端本地地址的字節(jié)長度,這個(gè)參數(shù)既是輸入?yún)?shù),又是輸出參數(shù)。實(shí)現(xiàn)監(jiān)聽、接受和處理的代碼如下:

#define MAX_CONNECTION_NUMBER 10int server_client_length, server_client_sockfd;struct sockaddr_un server_client_address;listen(server_sockfd, MAX_CONNECTION_NUMBER);while(1){  // ...... (some process code)  server_client_length = sizeof(server_client_address);  server_client_sockfd = accept(server_sockfd, (struct sockaddr*)&server_client_address, &server_client_length);  // ...... (some process code)}

這里使用死循環(huán)的原因是服務(wù)器是一個(gè)不斷提供服務(wù)的實(shí)體,它需要不間斷的進(jìn)行監(jiān)聽、接受并處理連接,本例中,每個(gè)連接只能進(jìn)行串行處理,即一個(gè)連接處理完后,才能進(jìn)行后續(xù)連接的處理。如果想要多個(gè)連接并發(fā)處理,則需要?jiǎng)?chuàng)建線程,將每個(gè)連接交給相應(yīng)的線程并發(fā)處理。

客戶端套接字創(chuàng)建完畢并賦予本地地址值后,需要連接到服務(wù)器端進(jìn)行通信,讓服務(wù)器端為其提供處理服務(wù)。對(duì)于 SOCK_STREAM 類型的流式套接字,需要客戶端與服務(wù)器之間進(jìn)行連接方可使用。連接要使用 connect 系統(tǒng)調(diào)用,其原形為

int connect(int socket, const struct sockaddr *address, size_t address_len);

其中socket為客戶端的套接字描述符,address表示當(dāng)前客戶端的本地地址,是一個(gè) struct sockaddr_un 類型的變量,address_len 表示本地地址的字節(jié)長度。實(shí)現(xiàn)連接的代碼如下:

connect(client_sockfd, (struct sockaddr*)&client_address, sizeof(client_address));

無論客戶端還是服務(wù)器,都要和對(duì)方進(jìn)行數(shù)據(jù)上的交互,這種交互也正是我們進(jìn)程通信的主題。一個(gè)進(jìn)程扮演客戶端的角色,另外一個(gè)進(jìn)程扮演服務(wù)器的角色,兩個(gè)進(jìn)程之間相互發(fā)送接收數(shù)據(jù),這就是基于本地套接字的進(jìn)程通信。發(fā)送和接收數(shù)據(jù)要使用 write 和 read 系統(tǒng)調(diào)用,它們的原形為:

int read(int socket, char *buffer, size_t len);int write(int socket, char *buffer, size_t len);

其中 socket 為套接字描述符;len 為需要發(fā)送或需要接收的數(shù)據(jù)長度;對(duì)于 read 系統(tǒng)調(diào)用,buffer 是用來存放接收數(shù)據(jù)的緩沖區(qū),即接收來的數(shù)據(jù)存入其中,是一個(gè)輸出參數(shù);對(duì)于 write 系統(tǒng)調(diào)用,buffer 用來存放需要發(fā)送出去的數(shù)據(jù),即 buffer 內(nèi)的數(shù)據(jù)被發(fā)送出去,是一個(gè)輸入?yún)?shù);返回值為已經(jīng)發(fā)送或接收的數(shù)據(jù)長度。例如客戶端要發(fā)送一個(gè) "Hello" 字符串給服務(wù)器,則代碼如下:

char buffer[10] = "Hello";write(client_sockfd, buffer, strlen(buffer));

交互完成后,需要將連接斷開以節(jié)省資源,使用close系統(tǒng)調(diào)用,其原形為:

int close(int socket);

不多說了,直接使用,大家一定都會(huì),呵呵!

上面所述的每個(gè)系統(tǒng)調(diào)用都有 -1 返回值,在調(diào)用不成功時(shí),它們均會(huì)返回 -1,這個(gè)特性可以使得我們用 if - else 或異常處理語句來處理錯(cuò)誤,為我們提供了很大的方便。

SOCK_DGRAM 數(shù)據(jù)報(bào)式本地套接字的應(yīng)用場(chǎng)合很少,因?yàn)榱魇教捉幼衷诒镜氐倪B接時(shí)間可以忽略,所以效率并沒有提高,而且發(fā)送接收都需要攜帶對(duì)方的本地地址,因此很少甚至幾乎不使用。

與本地套接字相對(duì)應(yīng)的是網(wǎng)絡(luò)套接字,可以用于在網(wǎng)絡(luò)上傳送數(shù)據(jù),換言之,可實(shí)現(xiàn)不同機(jī)器上的進(jìn)程通信過程。在 TCP/IP 協(xié)議中,IP 地址的首字節(jié)為 127 即代表本地,因此本地套接字通信可以使用 IP 地址為 127.x.x.x 的網(wǎng)絡(luò)套接字來實(shí)現(xiàn)。

總結(jié)

以上就是本文關(guān)于Linux進(jìn)程間通信方式之socket使用實(shí)例的全部內(nèi)容,希望對(duì)大家有所幫助。感謝朋友們對(duì)本站的支持。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
日韩成人免费在线视频| 免费在线观看一区二区三区| 久久www成人_看片免费不卡| 日本免费一区二区三区视频观看| 国产 高清 精品 在线 a| 国产美女黄色| 美女被艹视频网站| 亚洲视频在线观看| 嫩草影院入口一二三免费| 一区二区三区在线观看网站| 欧美黄色一级大片| 在线观看不卡| 免费无码不卡视频在线观看| 第一sis亚洲原创| 精品推荐蜜桃传媒| 日韩1区2区日韩1区2区| 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品第一页在线| 欧美色视频日本版| 久久综合亚洲精品| 欧美性受xxxx黑人xyx| 欧美日本三级| 亚洲女人天堂av| 久久久久久午夜| 成人一区二区三区视频| 8v天堂国产在线一区二区| 亚洲精品在线视频观看| 91精品国产乱码久久久久久久| 美女毛片一区二区三区四区最新中文字幕亚洲| 一个人看的www日本高清视频| 亚洲综合激情| 二区视频在线| 国产一级特黄a高潮片| www.美色吧.com| 欧美色xxxx| 欧美日韩四区| 国产精品毛片高清在线完整版| 天堂在线www天堂中文在线| www.天天操.com| 国产精品白丝久久av网站| 黄色直播在线| 婷婷色在线播放| 人人爽久久涩噜噜噜网站| 国产偷拍一区二区| 欧美 另类 交| 精品国产三级电影在线观看| 激情欧美一区二区三区| 国产精品推荐精品| 五月天婷婷激情| 伊人青青综合网站| 高清国语自产拍免费视频国产| 日韩精品一区二区三区高清免费| 亚洲精品狠狠操| 日韩一级片免费| 99riav视频在线观看| 日韩熟女一区二区| 亚洲精品成人精品456| 日韩电影在线播放| 中文字字幕在线中文| 国产校园另类小说区| 亚洲欧洲日本在线| 国产youjizz在线| 无遮挡又爽又刺激的视频| www.亚洲激情| 国产高清视频色在线www| 一区二区三区在线免费观看视频| 操操操综合网| 人妻人人澡人人添人人爽| 中文字幕精品av| 成人精品亚洲| www.天天干.com| 日本一本在线免费福利| 天堂资源在线中文精品| 国产色婷婷国产综合在线理论片a| 日韩欧美精品一区二区三区经典| 欧美性活一级视频| 日韩手机在线导航| 亚洲国产精品成人综合久久久| 国产精品日韩欧美综合| 粗大的内捧猛烈进出在线视频| 91自拍.com| 精品美女国产在线| 欧美日本三级| 国产日产欧美一区二区三区| 亚洲av午夜精品一区二区三区| 亚洲人的天堂男人爽爽爽| 中文字幕制服诱惑| 成人网6969conwww| av播放在线观看| 成人免费视频在线观看超级碰| 黄色免费网站视频| 天天干免费视频| 日韩精品免费观看| 亚洲 欧美 日韩系列| 日本一区二区三区四区在线视频| 精品国产1区2区| 91精品国产91久久久久久最新毛片| wwwxx在线观看| 亚洲国产裸拍裸体视频在线观看乱了中文| 日本性生活网站| 日韩特黄一级片| 日韩av电影在线观看| 波多野结衣有码| 最近中文字幕mv在线一区二区三区四区| 日韩欧美一区三区| 欧美乱偷一区二区三区在线| 国产人妖在线播放| 国产精品一区二区日韩| 国产97人人超碰caoprom| 国产成人久久精品77777综合| 中文网丁香综合网| 视频一区亚洲| 免费毛片在线看片免费丝瓜视频| 国产精品久久久久久久久免费相片| www.99re6| 亚洲香肠在线观看| 亚洲香蕉伊在人在线观| 红杏一区二区三区| 欧美黑人xx片| 亚洲精品人成| 国产精品久久一区| 动漫h在线观看| 国产超碰在线| 国产福利视频一区二区三区| 亚洲最黄网站| 欧美精品自拍视频| 久久久久久一二三区| 人妻无码一区二区三区四区| 亚洲最大视频网| 蜜桃视频一区二区在线观看| 成人福利免费网站| 国产99精品视频| 久久久久无码精品国产| 国产一区二区三区蝌蚪| 一本一道久久a久久精品蜜桃| 国产精品yjizz视频网| 欧美电影完整版在线观看| 日韩免费电影| 黄色免费观看视频网站| 黄色亚洲免费| 亚洲电影欧美电影有声小说| 国产精品国产三级国产专区52| 亚洲欧洲日韩综合二区| 亚洲久色影视| 欧美高清视频一区二区三区在线观看| 成年无码av片在线| 五月激情丁香一区二区三区| 国产精品99久久精品| 在线无限看免费粉色视频| 嫩草影院在线观看未满十八| 亚洲动漫在线观看| 中文字幕一精品亚洲无线一区| 久久久久一区二区| 伊人网在线免费| 精品人妻一区二区三区蜜桃| 青青视频在线播放| 日色在线视频| 亚洲成人黄色网| 国产中文欧美日韩在线| 大香伊人久久| 一二美女精品欧洲| 白浆视频在线观看| 免费在线视频欧美| 亚洲日本japanese丝袜| 国产精品久久久久白浆| 蜜桃视频涩涩| 日韩在线观看视频一区| 国产婷婷成人久久av免费高清| 九色91av视频| 伊人久久综合一区二区| 2017亚洲天堂1024| 筱崎爱全乳无删减在线观看| 久久亚洲精品毛片| 欧美一级特黄aaa| 性xxxx奶大欧美高清| 国产**成人网毛片九色| 亚洲男人第一av网站| 在线观看免费黄网站| 日本成人在线视频网址| 黑人巨大猛交丰满少妇| 欧产日产国产精品视频| 国产影视一区二区| 少妇一区二区视频| 1024手机在线视频| canopen超线视频网线的应用| 另类一区二区| 国产福利在线免费观看| 波多野结衣91| 国产精品欧美一区二区三区奶水| 午夜精品一区二区三区视频免费看| 一区2区3区在线看| 欧美自拍偷拍一区二区| 国产精品日本精品| 无码人妻久久一区二区三区| 中文精品久久久久人妻不卡| av亚洲精华国产精华精华| 欧美精品一区二区三区四区| 五月婷婷在线视频| 成人做爰视频www网站小优视频| 亚洲日本在线视频观看| 亚洲欧美韩国| 在线精品观看国产| 永久免费在线观看视频| 亚洲一区二区在线播放| 污视频在线免费观看一区二区三区| 日韩精品av一区二区三区| 亚洲精品免费观看| 日本午夜大片a在线观看| 伦伦影院午夜理论片| av黄在线观看| 日韩毛片一二三区| 欧美诱惑福利视频| 亚洲电影在线一区二区三区| 日韩在线中文字幕| yellow视频在线观看一区二区| 香蕉久久免费电影| 91精品久久久| 男女视频在线观看免费| 亚洲成人1区2区| 亚洲一区二区三区四区五区中文| 色呦呦国产精品| jizz.日本| 视频精品一区二区三区| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 色偷偷网站视频| 岛国精品在线| 亚洲在线成人| 亚洲一区二区91| 久久精品夜夜夜夜久久| 亚洲一区亚洲| 亚洲天堂aaa| 丝袜美腿亚洲一区二区| 自拍偷拍欧美| 黄色一区二区视频| 欧美视频在线看| av资源中文色综合| 在线观看福利一区| jazzjazz国产精品麻豆| 欧美日韩另类在线| 国产在线视频自拍| 久久99精品国产麻豆不卡| 国产乱色精品成人免费视频| 日韩在线观看网站| 欧美日韩999| 黄色一级视频在线播放| 石原莉奈一区二区三区在线观看| 天堂av在线免费| 欧美 国产 精品| 精品国产一二三四区| 蜜桃成人精品| 在线免费观看成年人视频| 亚洲综合不卡| 伊人影院蕉久影院在线观看| 免费在线观看黄色| 性娇小13――14欧美| 老女人av在线| 肥婆老bbb肥婆bbbbb| 亚洲人成电影| 久久亚洲一区| 成人黄色动漫| www.黄色av| 精品一卡二卡三卡| 四虎成人免费影院| 美女脱光衣服与内衣内裤一区二区三区四区| 亚洲成人av影片| 日韩美女写真福利在线观看| 精品一区二区三区中文字幕在线| 国产一区观看| 欧美日韩国产激情| 蜜臀一区二区三区| 欧美理论在线| 国产视频网站在线| 中文字幕在线观看1| 国产精品人成在线观看免费| 9自拍视频在线观看| 一级特黄录像免费播放全99| 特级毛片在线观看| 亚洲视频一二| 国产精品自产拍在线观看2019| 欧美xxxx在线| 狠狠操夜夜操| 成年人福利视频| 免费看av在线| 午夜成人免费视频| 久久99国产精品久久| 黄色网页在线免费观看| 国产女人18水真多18精品一级做| 91福利社在线观看| 日本久久久久久久久久久久| 神马久久精品| 女人高潮一级片| 久久精品视频导航| 一区二区三区四区亚洲| 国产精品久久久久久久久久久久| 电影k8一区二区三区久久| 欧美劲爆第一页| 亚洲精品乱码久久久久久蜜桃91| 久久亚洲精品中文字幕| 欧美丝袜丝交足nylons图片| 日韩中文字幕高清在线观看| 午夜婷婷国产麻豆精品| 黑人巨大精品欧美一区二区免费| 国产乱子伦精品无码码专区| 91精品国产一区二区在线观看| 亚洲变态欧美另类捆绑| 亚洲免费av高清| 日韩视频在线观看一区二区| 日韩国产伦理| 99re6这里只有精品视频在线观看| 亚洲欧美日韩不卡一区二区三区| 91蝌蚪视频九色| 日韩国产精品一区| 日韩成人性视频| 香蕉网在线播放| 欧美性猛交丰臀xxxxx网站| 制服丝袜亚洲精品中文字幕| freemovies性欧美| 男的插女的下面视频| 国产 高清 精品 在线 a| xxxx在线播放| 亚洲精品乱码久久久久久金桔影视| t66y永久入口地址| 精品久久香蕉国产线看观看gif| 国产美女av一区二区三区| 国产精品流白浆视频| 人人做人人爽人人爱| 在线一级观看| 日韩影院二区|