日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux--select

發(fā)布時間:2024/9/30 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux--select 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在linux中的I/O都是用文件描述符表示的,文件描述符就是一個int,比如0是標(biāo)準(zhǔn)輸入,1是標(biāo)準(zhǔn)輸出,2是標(biāo)準(zhǔn)錯誤輸出。同理,socket也是返回一個int文件描述符。

select系統(tǒng)調(diào)用是用來讓我們的程序監(jiān)視多個文件描述符(file descriptor)的狀態(tài)變化的。程序會停在select這里等待,直到被監(jiān)視的文件描述符有某一個或多個發(fā)生了狀態(tài)改變。

只要有一個描述符狀態(tài)變?yōu)榭捎?#xff0c;select會停止堵塞,繼續(xù)往下執(zhí)行,這時我們就需要用輪詢的方法查出是哪個文件描述符可用。

理解select模型的關(guān)鍵在于理解fd_set,為說明方便,取fd_set長度為1字節(jié),fd_set中的每一bit可以對應(yīng)一個文件描述符fd。則1字節(jié)長的fd_set最大可以對應(yīng)8個fd。
(1)執(zhí)行fd_set set; FD_ZERO(&set);則set用位表示是0000,0000。
(2)若fd=5,執(zhí)行FD_SET(fd,&set);后set變?yōu)?0000100(第5位置為1)
(3)若再加入fd=2,fd=1,則set變?yōu)?span style="color:rgb(51,51,51); font-family:微軟雅黑,Tahoma,Verdana,Arial,Helvetica,'宋 体 ',sans-serif; font-size:14px; line-height:20px; text-align:left">01100100
(4)執(zhí)行select(6,&set,0,0,0)阻塞等待(第一個參數(shù)是最大的文件描述符+1)
(5)若fd=1,fd=2上都發(fā)生可讀事件,則select返回,此時set變?yōu)?span style="color:rgb(51,51,51); font-family:微軟雅黑,Tahoma,Verdana,Arial,Helvetica,'宋 体 ',sans-serif; font-size:14px; line-height:20px; text-align:left">01100000。注意:沒有事件發(fā)生的fd=5被清空。

注意第五條中的fd=5被清空,說明只要是不活躍的文件描述符都會在select的阻塞被結(jié)束后從原有的文件描述集合fd_set中被去除。因此在socket使用select的場景下,是可以在while輪詢中使用FD_ISSET宏來不斷監(jiān)聽服務(wù)器端生成的socket文件描述符是否活躍。


FD_ZERO(fd_set *fdset):清空fdset與所有文件句柄的聯(lián)系。
FD_SET(int fd, fd_set *fdset):建立文件句柄fd與fdset的聯(lián)系。
FD_CLR(int fd, fd_set *fdset):清除文件句柄fd與fdset的聯(lián)系。
FD_ISSET(int fd, fdset *fdset):檢查fdset聯(lián)系的文件句柄fd是否可讀寫,>0表示可讀寫。


可以采用select實現(xiàn) ??并發(fā)服務(wù)器:多路復(fù)用I/O

下面是服務(wù)器select并發(fā)版本:

http://blog.csdn.net/vagrxie/article/details/3948204

select模型屬于網(wǎng)絡(luò)的I/O復(fù)用模型,比純粹的阻塞I/O模型更具有實用性,因為可以同時等待多個描述字的就緒。

當(dāng)年學(xué)習(xí)C/C++的時候,很少碰到底層以數(shù)字標(biāo)示的描述字,只在寫文件系統(tǒng)的去嘗試各種情況,以獲得最佳效率的時候?qū)嶋H嘗試使用過一次,一直覺得那種open,write,read的文件操作方式,實在是比fopen一族函數(shù)還要低級的方式-_-!平時沒有必要使用。但是等到網(wǎng)絡(luò)編程的時候,才發(fā)現(xiàn)。。。。原來這么底層的東西,竟然也有一定的通用性,文件的描述字和網(wǎng)絡(luò)的描述字竟然是一致的-_-!不管是誰設(shè)計的,還是挺佩服的。。。。。。

???????這里僅僅是為了學(xué)習(xí)Select模型而寫的學(xué)習(xí)例子,作用是在服務(wù)器端輸出連接上的客戶端的IP(僅以數(shù)字形式),然后將客戶端的IP以字符串的形式返回,客戶端連接服務(wù)器,并接受由服務(wù)器端返回的IP地址,然后輸出轉(zhuǎn)換為字符串形式的IP地址和數(shù)字形式的IP地址,為了區(qū)別select到正確的不同listen套接字,這里用了不同的端口,并且不同的兩個套接字響應(yīng)時以echo 1,echo 2區(qū)別。功能是很簡單的,僅僅用于學(xué)習(xí),所以其中很多地方本來可以抽出來稱為函數(shù)的,都貪簡單,直接復(fù)制了(-_-!這里本來習(xí)慣想說Ctrl-C Ctrl-V的。。。但是發(fā)現(xiàn)自己實在Ubuntu下用vim復(fù)制的,好像和實際情況不符。。。。)

???????另外。。。。由于用的是《Unix Network Programming》一書,所以編程風(fēng)格都變得有點像書中了。。。。服務(wù)器端全是自己寫的,客戶端代碼由書中的daytime客戶端改過來的,并且發(fā)現(xiàn)書中客戶端代碼都不關(guān)閉套接字,都交由退出進(jìn)程的時候由系統(tǒng)關(guān)閉,不知道這種風(fēng)格好不好。由于學(xué)習(xí)。。。寫的是ANSI C程序,用gcc編譯-_-!

unp.h是《Unix Network Programming》源代碼中的公用頭文件,makefile可能也得注意一下,為了圖省事,我用了其源代碼中的Make.defines,因為這樣比自己寫簡單多了:),makefile就不貼了,沒有什么學(xué)習(xí)意義。

?

運(yùn)行效果如下:

客戶端運(yùn)行:

./TestSelectCli 127.0.0.1 1000

Conncet OK

127.0.0.1:16777343 Echo 1.

laptop:~/unpv1/unpv13e/MyTest$ ./TestSelectCli 127.0.0.1 1001

Conncet OK

127.0.0.1:16777343 Echo 2.

laptop:~/unpv1/unpv13e/MyTest$ ./TestSelectCli 192.168.0.138 1000

Conncet OK

192.168.0.138:2315299008 Echo 1.

laptop:~/unpv1/unpv13e/MyTest$ ./TestSelectCli 192.168.0.138 1001

Conncet OK

192.168.0.138:2315299008 Echo 2.

?

服務(wù)器端輸出:

2315299008 Echo 1.

16777343 Echo 1.

16777343 Echo 2.

2315299008 Echo 1.

2315299008 Echo 2.

?

?

服務(wù)器端源代碼:

?

??1?#include????"unp.h"
??2?
??3?
??4?void?str_echo1(int?connfd);
??5?void?str_echo2(int?connfd);
??6?
??7?int?main(int?argc,?char?**argv)
??8?{
??9?????struct?sockaddr_in cliaddr;
?10?????pid_t childpid;
?11?
?12?????/*??Bind 1000 port to listen socket 1 */
?13?????int?listenfd1 = Socket(AF_INET, SOCK_STREAM,?0);
?14?
?15?????struct?sockaddr_in servaddr;
?16?????bzero(&servaddr,?sizeof(servaddr));
?17?????servaddr.sin_family = AF_INET;
?18?????servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
?19?????servaddr.sin_port = htons(1000);
?20?
?21?????Bind(listenfd1, (SA *)&servaddr,?sizeof(servaddr));
?22?
?23?????Listen(listenfd1, LISTENQ);
?24?
?25?????/*??Bind 1001 port to listen socket 2*/
?26?????int?listenfd2 = Socket(AF_INET, SOCK_STREAM,?0);
?27?
?28?????struct?sockaddr_in servaddr2;
?29?????bzero(&servaddr2,?sizeof(servaddr2));
?30?????servaddr2.sin_family = AF_INET;
?31?????servaddr2.sin_addr.s_addr = htonl(INADDR_ANY);
?32?????servaddr2.sin_port = htons(1001);
?33?
?34?????Bind(listenfd2, (SA *)&servaddr2,?sizeof(servaddr2));
?35?
?36?????Listen(listenfd2, LISTENQ);
?37?
?38?????/*?Initialize fd_set struct */
?39?????int?maxfdp1 = max(listenfd1, listenfd2) +?1;
?40?????fd_set rset;
?41?????FD_ZERO(&rset);
?42?
?43?????/*??Select from this two listen socket */
?44?????for( ; ; )
?45?????{
?46?????????FD_SET(listenfd1, &rset);
?47?????????FD_SET(listenfd2, &rset);
?48?
?49?????????int?nready = -1;
?50?????????if( (nready = select(maxfdp1, &rset,?NULL,?NULL,NULL)) <?0)//只要有一個客戶連接,select就停止堵塞
?51?????????{
?52?????????????if(EINTR?== errno)
?53?????????????{
?54?????????????????continue;
?55?????????????}
?56?????????????else
?57?????????????{
?58?????????????????err_sys("Select error.");
?59?????????????}
?60?????????}
?61?
?62?????????/*??some one listening socket is readable.*/
?63?????????if(FD_ISSET(listenfd1, &rset))
?64?????????{
?65?????????????socklen_t len =?sizeof(cliaddr);
?66?????????????int?connfd = Accept(listenfd1, (SA *)&cliaddr, &len);
?67?
?68?????????????if(?0?== (childpid = Fork()) )
?69?????????????{
?70?????????????????/*?child process */
?71?????????????????Close(listenfd1);
?72?
?73?????????????????str_echo1(connfd);
?74?????????????????exit(0);
?75?????????????}
?76?
?77?????????????/*?parent process??*/
?78?????????????Close(connfd);
?79?
?80?????????}
?81?
?82?
?83?????????if(FD_ISSET(listenfd2, &rset))
?84?????????{
?85?????????????socklen_t len =?sizeof(cliaddr);
?86?????????????int?connfd = Accept(listenfd2, (SA *)&cliaddr, &len);
?87?
?88?????????????if(?0?== (childpid = Fork()) )
?89?????????????{
?90?????????????????/*?child process */
?91?????????????????Close(listenfd2);
?92?
?93?????????????????str_echo2(connfd);
?94?????????????????exit(0);
?95?????????????}
?96?
?97?????????????/*?parent process??*/
?98?????????????Close(connfd);
?99?
100?????????}
101?
102?????}
103?
104?????exit(0);
105?}
106?
107?void?str_echo1(int?connfd)
108?{
109?????struct?sockaddr_in clientAddr;
110?????socklen_t len =?sizeof(clientAddr);
111?
112?????if(getpeername(connfd, (SA*) &clientAddr, &len) <?0)
113?????{
114?????????return;
115?????}
116?
117?????char?lcBuffer[MAXLINE] = {0};
118?????sprintf(lcBuffer,?"%u?Echo 1.", clientAddr.sin_addr.s_addr);
119?
120?????printf("%s/n", lcBuffer);
121?
122?????Write(connfd, lcBuffer, MAXLINE);
123?}
124?
125?
126?void?str_echo2(int?connfd)
127?{
128?????struct?sockaddr_in clientAddr;
129?????socklen_t len =?sizeof(clientAddr);
130?
131?????if(getpeername(connfd, (SA*) &clientAddr, &len) <?0)
132?????{
133?????????return;
134?????}
135?
136?
137?????char?lcBuffer[MAXLINE] = {0};
138?????sprintf(lcBuffer,?"%u?Echo 2.", clientAddr.sin_addr.s_addr);
139?
140?????printf("%s/n", lcBuffer);
141?
142?????Write(connfd, lcBuffer, MAXLINE);
143?}
144?
145

?

客戶端源代碼:

?1?#include????"unp.h"
?2?
?3?int?main(int?argc,?char?**argv)
?4?{
?5?????int????????????????????sockfd, n;
?6?????char?????????????? recvline[MAXLINE +?1];
?7?????struct?sockaddr_in servaddr;
?8?
?9?????if?(argc !=?3)
10?????????err_quit("usage: a.out <IPaddress> <IPPort>");
11?
12?????int?port = atoi(argv[2]);
13?
14?????if?( (sockfd = socket(AF_INET, SOCK_STREAM,?0)) <?0)
15?????????err_sys("socket error");
16?
17?????bzero(&servaddr,?sizeof(servaddr));
18?????servaddr.sin_family = AF_INET;
19?????servaddr.sin_port?? = htons(port);
20?????if?(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <=0)
21?????????err_quit("inet_pton error for?%s", argv[1]);
22?
23?????if?(connect(sockfd, (SA *) &servaddr,?sizeof(servaddr)) <?0)
24?????????err_sys("connect error");
25?
26?????printf("Conncet OK/n");
27?
28?????while?( (n = read(sockfd, recvline, MAXLINE)) >?0) {
29?????????recvline[n] =?0;??/*?null terminate */
30?
31?????????/*??change number string to number and to ip string */
32?????????struct?in_addr svraddr;
33?????????svraddr.s_addr = strtoul(recvline,?NULL,?10);
34?????????char?*pszsvraddr = inet_ntoa(svraddr);
35?
36?????????printf("%s:%s/n", pszsvraddr, recvline);
37?????}
38?????if?(n <?0)
39?????????err_sys("read error");
40?
41?????exit(0);
42?}


下面更簡潔的代碼會加深理解

我們要監(jiān)控readfd文件描述符數(shù)組

int use_select(int *readfd,int n)?
{?
?? fd_set my_readfd;?
?? int maxfd;?
?? int i;?
????
?? maxfd=readfd[0];?
?? for(i=1;i <n;++i) ? if(readfd[i]>maxfd) maxfd=readfd[i];?
?? while(1)?
?? {?
??????? /*?? 將所有的文件描述符加入?? */?
??????? FD_ZERO(&my_readfd);?
??????? for(i=0;i??<n;++i)?????????? FD_SET(readfd[i],*my_readfd);?
??????? /*???? 進(jìn)程阻塞???????????????? */?
??????? select(maxfd+1,& my_readfd,NULL,NULL,NULL);?
??????? /*??????? 有東西可以讀了?????? */?
??????? for(i=0;i?<n;++i)? ? ?if(FD_ISSET(readfd[i],&my_readfd))?
????????????? {?
????????????????? /* 原來是我可以讀了 */?
??????????????????????? we_read(readfd[i]);?
????????????? }?
?? }?
}


select監(jiān)控的是一個文件描述符數(shù)組,一旦至少一個文件描述符可以用了,select停止堵塞,這時程序需要一個輪詢確定具體哪個文件可以用了。


下面是一個?用select實現(xiàn)的異步聊天程序:

服務(wù)器端:

#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/time.h> #include <sys/types.h>#define MAXBUF 1024 /************關(guān)于本文檔******************************************** *filename: async-server.c *purpose: 演示網(wǎng)絡(luò)異步通訊,這是服務(wù)器端程序 *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com) Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言 *date time:2007-01-25 21:22 *Note: 任何人可以任意復(fù)制代碼并運(yùn)用這些文檔,當(dāng)然包括你的商業(yè)用途 * 但請遵循GPL *Thanks to: Google.com *Hope:希望越來越多的人貢獻(xiàn)自己的力量,為科學(xué)技術(shù)發(fā)展出力 * 科技站在巨人的肩膀上進(jìn)步更快!感謝有開源前輩的貢獻(xiàn)! *********************************************************************/int main(int argc, char **argv) {int sockfd, new_fd;socklen_t len;struct sockaddr_in my_addr, their_addr;unsigned int myport, lisnum;char buf[MAXBUF + 1];fd_set rfds;struct timeval tv;int retval, maxfd = -1;if (argv[1])myport = atoi(argv[1]);elsemyport = 7838;if (argv[2])lisnum = atoi(argv[2]);elselisnum = 2;if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);}bzero(&my_addr, sizeof(my_addr));my_addr.sin_family = PF_INET;my_addr.sin_port = htons(myport);if (argv[3])my_addr.sin_addr.s_addr = inet_addr(argv[3]);elsemy_addr.sin_addr.s_addr = INADDR_ANY;if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))== -1) {perror("bind");exit(1);}if (listen(sockfd, lisnum) == -1) {perror("listen");exit(1);}while (1) {printf("\n----等待新的連接到來開始新一輪聊天……\n");len = sizeof(struct sockaddr);if ((new_fd =accept(sockfd, (struct sockaddr *) &their_addr,&len)) == -1) {perror("accept");exit(errno);} elseprintf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(their_addr.sin_addr),ntohs(their_addr.sin_port), new_fd);/* 開始處理每個新連接上的數(shù)據(jù)收發(fā) */printf("\n準(zhǔn)備就緒,可以開始聊天了……直接輸入消息回車即可發(fā)信息給對方\n");while (1) {/* 把集合清空 */FD_ZERO(&rfds);/* 把標(biāo)準(zhǔn)輸入句柄0加入到集合中 */FD_SET(0, &rfds);maxfd = 0;/* 把當(dāng)前連接句柄new_fd加入到集合中 */FD_SET(new_fd, &rfds);if (new_fd > maxfd)maxfd = new_fd;/* 設(shè)置最大等待時間 */tv.tv_sec = 1;tv.tv_usec = 0;/* 開始等待 */retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);if (retval == -1) {printf("將退出,select出錯! %s", strerror(errno));break;} else if (retval == 0) {/* printf("沒有任何消息到來,用戶也沒有按鍵,繼續(xù)等待……\n"); */continue;} else {if (FD_ISSET(0, &rfds)) {/* 用戶按鍵了,則讀取用戶輸入的內(nèi)容發(fā)送出去 */bzero(buf, MAXBUF + 1);fgets(buf, MAXBUF, stdin);if (!strncasecmp(buf, "quit", 4)) {printf("自己請求終止聊天!\n");break;}len = send(new_fd, buf, strlen(buf) - 1, 0);if (len > 0)printf("消息:%s\t發(fā)送成功,共發(fā)送了%d個字節(jié)!\n",buf, len);else {printf("消息'%s'發(fā)送失敗!錯誤代碼是%d,錯誤信息是'%s'\n",buf, errno, strerror(errno));break;}}if (FD_ISSET(new_fd, &rfds)) {/* 當(dāng)前連接的socket上有消息到來則接收對方發(fā)過來的消息并顯示 */bzero(buf, MAXBUF + 1);/* 接收客戶端的消息 */len = recv(new_fd, buf, MAXBUF, 0);if (len > 0)printf("接收消息成功:'%s',共%d個字節(jié)的數(shù)據(jù)\n",buf, len);else {if (len < 0)printf("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'\n",errno, strerror(errno));elseprintf("對方退出了,聊天終止\n");break;}}}}close(new_fd);/* 處理每個新連接上的數(shù)據(jù)收發(fā)結(jié)束 */printf("還要和其它連接聊天嗎?(no->退出)");fflush(stdout);bzero(buf, MAXBUF + 1);fgets(buf, MAXBUF, stdin);if (!strncasecmp(buf, "no", 2)) {printf("終止聊天!\n");break;}}close(sockfd);return 0; }
用select實現(xiàn)服務(wù)器的好處是,當(dāng)客戶與其建立連接之后,客戶可能要過段時間才發(fā)送消息,如果之前普通的處理,服務(wù)器只能堵塞在recv,不能有其他操作;而用select監(jiān)控輸入文件描述符和socket描述符,只要有一個準(zhǔn)備好,select就返回,譬如,select堵塞時,只要服務(wù)器輸入消息,并回車發(fā)送時,select檢測到輸入文件描述符,就立馬返回,將消息發(fā)送給客戶端;



客戶端程序:

#include <stdio.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <resolv.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <sys/time.h> #include <sys/types.h>#define MAXBUF 1024 /************關(guān)于本文檔******************************************** // *filename: ssync-client.c *purpose: 演示網(wǎng)絡(luò)異步通訊,這是客戶端程序 *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com) Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言 *date time:2007-01-25 21:32 *Note: 任何人可以任意復(fù)制代碼并運(yùn)用這些文檔,當(dāng)然包括你的商業(yè)用途 * 但請遵循GPL *Thanks to: Google.com *Hope:希望越來越多的人貢獻(xiàn)自己的力量,為科學(xué)技術(shù)發(fā)展出力 * 科技站在巨人的肩膀上進(jìn)步更快!感謝有開源前輩的貢獻(xiàn)! *********************************************************************/ int main(int argc, char **argv) {int sockfd, len;struct sockaddr_in dest;char buffer[MAXBUF + 1];fd_set rfds;struct timeval tv;int retval, maxfd = -1;if (argc != 3) {printf("參數(shù)格式錯誤!正確用法如下:\n\t\t%s IP地址 端口\n\t比如:\t%s 127.0.0.1 80\n此程序用來從某個 IP 地址的服務(wù)器某個端口接收最多 MAXBUF 個字節(jié)的消息",argv[0], argv[0]);exit(0);}/* 創(chuàng)建一個 socket 用于 tcp 通信 */if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("Socket");exit(errno);}/* 初始化服務(wù)器端(對方)的地址和端口信息 */bzero(&dest, sizeof(dest));dest.sin_family = AF_INET;dest.sin_port = htons(atoi(argv[2]));if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {perror(argv[1]);exit(errno);}/* 連接服務(wù)器 */if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {perror("Connect ");exit(errno);}printf("\n準(zhǔn)備就緒,可以開始聊天了……直接輸入消息回車即可發(fā)信息給對方\n");while (1) {/* 把集合清空 */FD_ZERO(&rfds);/* 把標(biāo)準(zhǔn)輸入句柄0加入到集合中 */FD_SET(0, &rfds);maxfd = 0;/* 把當(dāng)前連接句柄sockfd加入到集合中 */FD_SET(sockfd, &rfds);if (sockfd > maxfd)maxfd = sockfd;/* 設(shè)置最大等待時間 */tv.tv_sec = 1;tv.tv_usec = 0;/* 開始等待 */retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);if (retval == -1) {printf("將退出,select出錯! %s", strerror(errno));break;} else if (retval == 0) {/* printf("沒有任何消息到來,用戶也沒有按鍵,繼續(xù)等待……\n"); */continue;} else {if (FD_ISSET(sockfd, &rfds)) {/* 連接的socket上有消息到來則接收對方發(fā)過來的消息并顯示 */bzero(buffer, MAXBUF + 1);/* 接收對方發(fā)過來的消息,最多接收 MAXBUF 個字節(jié) */len = recv(sockfd, buffer, MAXBUF, 0);if (len > 0)printf("接收消息成功:'%s',共%d個字節(jié)的數(shù)據(jù)\n",buffer, len);else {if (len < 0)printf("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'\n",errno, strerror(errno));elseprintf("對方退出了,聊天終止!\n");break;}}if (FD_ISSET(0, &rfds)) {/* 用戶按鍵了,則讀取用戶輸入的內(nèi)容發(fā)送出去 */bzero(buffer, MAXBUF + 1);fgets(buffer, MAXBUF, stdin);if (!strncasecmp(buffer, "quit", 4)) {printf("自己請求終止聊天!\n");break;}/* 發(fā)消息給服務(wù)器 */len = send(sockfd, buffer, strlen(buffer) - 1, 0);if (len < 0) {printf("消息'%s'發(fā)送失敗!錯誤代碼是%d,錯誤信息是'%s'\n",buffer, errno, strerror(errno));break;} elseprintf("消息:%s\t發(fā)送成功,共發(fā)送了%d個字節(jié)!\n",buffer, len);}}}/* 關(guān)閉連接 */close(sockfd);return 0; } 編譯用如下命令:
gcc -Wall async-server.c -o server
gcc -Wall async-client.c -o client
運(yùn)行用如下命令:
./server 7838 1
./client 127.0.0.1 7838



下面還是一個簡單的并發(fā)處理的服務(wù)器,但是僅僅是能多路復(fù)用I/O,但是不能同時處理連接請求,因為這只有一個線程

http://www.cnblogs.com/faraway/archive/2009/03/06/1404449.html

使用select函數(shù)可以以非阻塞的方式和多個socket通信。程序只是演示select函數(shù)的使用,功能非常簡單,即使某個連接關(guān)閉以后也不會修改當(dāng)前連接數(shù),連接數(shù)達(dá)到最大值后會終止程序。

1. 程序使用了一個數(shù)組fd_A,通信開始后把需要通信的多個socket描述符都放入此數(shù)組。

2. 首先生成一個叫sock_fd的socket描述符,用于監(jiān)聽端口。

3. 將sock_fd和數(shù)組fd_A中不為0的描述符放入select將檢查的集合fdsr。

4. 處理fdsr中可以接收數(shù)據(jù)的連接。如果是sock_fd,表明有新連接加入,將新加入連接的socket描述符放置到fd_A。

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define MYPORT 1234 // the port users will be connecting to#define BACKLOG 5 // how many pending connections queue will hold#define BUF_SIZE 200int fd_A[BACKLOG]; // accepted connection fdint conn_amount; // current connection amountvoid showclient(){int i;printf("client amount: %d\n", conn_amount);for (i = 0; i < BACKLOG; i++) {printf("[%d]:%d ", i, fd_A[i]);}printf("\n\n");}int main(void){int sock_fd, new_fd; // listen on sock_fd, new connection on new_fdstruct sockaddr_in server_addr; // server address informationstruct sockaddr_in client_addr; // connector's address informationsocklen_t sin_size;int yes = 1;char buf[BUF_SIZE];int ret;int i;if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);}if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {perror("setsockopt");exit(1);}server_addr.sin_family = AF_INET; // host byte orderserver_addr.sin_port = htons(MYPORT); // short, network byte orderserver_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IPmemset(server_addr.sin_zero, '\0', sizeof(server_addr.sin_zero));if (bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("bind");exit(1);}if (listen(sock_fd, BACKLOG) == -1) {perror("listen");exit(1);}printf("listen port %d\n", MYPORT);fd_set fdsr;int maxsock;struct timeval tv;conn_amount = 0;sin_size = sizeof(client_addr);maxsock = sock_fd;while (1) {// initialize file descriptor setFD_ZERO(&fdsr);FD_SET(sock_fd, &fdsr);// timeout settingtv.tv_sec = 30;tv.tv_usec = 0;// add active connection to fd setfor (i = 0; i < BACKLOG; i++) {if (fd_A[i] != 0) {FD_SET(fd_A[i], &fdsr);}}ret = select(maxsock + 1, &fdsr, NULL, NULL, &tv);if (ret < 0) {perror("select");break;} else if (ret == 0) {printf("timeout\n");continue;}// check every fd in the setfor (i = 0; i < conn_amount; i++) {if (FD_ISSET(fd_A[i], &fdsr)) {ret = recv(fd_A[i], buf, sizeof(buf), 0);if (ret <= 0) { // client closeprintf("client[%d] close\n", i);close(fd_A[i]);FD_CLR(fd_A[i], &fdsr);fd_A[i] = 0;} else { // receive dataif (ret < BUF_SIZE)memset(&buf[ret], '\0', 1);printf("client[%d] send:%s\n", i, buf);}}}// check whether a new connection comesif (FD_ISSET(sock_fd, &fdsr)) {new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &sin_size);if (new_fd <= 0) {perror("accept");continue;}// add to fd queueif (conn_amount < BACKLOG) {fd_A[conn_amount++] = new_fd;printf("new connection client[%d] %s:%d\n", conn_amount,inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));if (new_fd > maxsock)maxsock = new_fd;}else {printf("max connections arrive, exit\n");send(new_fd, "bye", 4, 0);close(new_fd);break;}}showclient();}// close other connectionsfor (i = 0; i < BACKLOG; i++) {if (fd_A[i] != 0) {close(fd_A[i]);}}exit(0);}
有網(wǎng)友提出了點改進(jìn):

accept函數(shù)里面fd_A[conn_amount++] = new_fd;可以稍加改進(jìn),按照樓主的意圖,會出現(xiàn)當(dāng)一個用戶不斷連接再斷開的情況下,當(dāng)連接次數(shù)超過maxconnection的時候,就會退出,因此fd_A[i]沒有很好的利用,不能實現(xiàn)動態(tài)管理,我建議僅將conn_amount僅作為客戶端連接數(shù),而不是有連接就增加,當(dāng)accept成功的時候,就加1,當(dāng)recv=0的時候就減1;建議將fd_A[conn_amount++] = new_fd;這句程序改為
for(i = 0;i < MAXCLIENT;i++)
{
if(fd[i] == 0)
{
fd[i] = new_fd;
break;
}

}
conn_amount++;
這樣就可以重復(fù)利用fd[i]的空間;
另外在recv返回值<=0的時候,加一句conn_amount++;
還有一點,超過最大連接數(shù)的時候break應(yīng)該為continue,這樣會更人性化一點,客戶端太多關(guān)閉它的請求就行了,沒必要自毀,這樣整個系統(tǒng)就可以動態(tài)與客戶端實現(xiàn)連接,





總結(jié)

以上是生活随笔為你收集整理的linux--select的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

91香蕉视频污在线 | 天天操天天干天天爱 | 成片免费观看视频999 | 国产一区成人 | 成人免费观看网址 | 国产精品亚洲a | 超碰在线日本 | 日韩精品一区电影 | 亚洲天堂网在线视频 | 亚洲精品视频免费 | 亚洲视频播放 | 黄色电影在线免费观看 | 最近中文字幕免费大全 | 色中射 | 日日夜夜噜 | 在线小视频国产 | 黄色小说在线观看视频 | 免费看国产曰批40分钟 | 美女视频黄的免费的 | 日本中文字幕高清 | 国产精品久久久久久久久久尿 | 日本黄色片一区二区 | 日本激情动作片免费看 | 欧美a影视| 丝袜一区在线 | 一级黄色片在线播放 | 精品国产视频在线观看 | av中文字幕亚洲 | 婷婷色在线观看 | 国产精品久久在线观看 | 久久字幕网 | 成人欧美一区二区三区黑人麻豆 | 99久在线精品99re8热视频 | 亚洲欧美日韩国产精品一区午夜 | 亚洲va韩国va欧美va精四季 | 91亚洲精品国偷拍 | 天天操天天色天天射 | 四虎影视www | 超碰精品在线观看 | 久久久久久久久久久成人 | 久久九九视频 | 久久福利综合 | 日韩v欧美v日本v亚洲v国产v | 黄色看片| 免费av福利| 中文字幕免| 一本一本久久a久久精品综合妖精 | 黄色成品视频 | 天堂在线一区二区 | 国产色拍拍拍拍在线精品 | 日韩亚洲在线 | 亚洲成人一区 | 国产精品中文 | 波多野结衣在线视频免费观看 | 成在人线av | 69国产在线观看 | 日韩欧美视频免费观看 | 日本中文字幕在线电影 | 亚洲精品人人 | 亚洲色图色 | 成人免费观看完整版电影 | 亚洲自拍自偷 | 亚洲一区日韩在线 | 亚洲精品视频在线观看免费视频 | 97碰碰精品嫩模在线播放 | 久久免费视频在线观看 | 成人黄色在线 | 国产免费叼嘿网站免费 | 91久久一区二区 | 99久久99久久精品 | 国产第页| 久久99国产视频 | 国产精品理论在线观看 | 黄色1级毛片 | 91精品国产一区二区在线观看 | 亚洲1区 在线 | 天天色天天干天天色 | 国产专区视频在线 | 亚洲国产影院 | 久草观看视频 | 成人av.com | www久草| 国产精品毛片一区视频播不卡 | 人人爱爱人人 | 久久免费精品国产 | 五月天六月丁香 | 亚洲电影影音先锋 | 欧美成人亚洲成人 | 国产免费一区二区三区最新 | 欧美日韩国产成人 | 亚洲2019精品 | 人人讲 | 激情婷婷 | 欧美日一级片 | 在线91网 | 国产999视频 | 亚洲经典视频在线观看 | 中文字幕色在线视频 | 国产最新在线视频 | 99久久日韩精品免费热麻豆美女 | 国产尤物视频在线 | 亚洲精品久久久蜜桃 | 国产亚洲成人网 | 欧美日韩一区二区在线观看 | 91九色视频观看 | 天天曰夜夜操 | 亚洲天堂自拍视频 | 在线观看国产v片 | 2020天天干夜夜爽 | 免费中午字幕无吗 | av中文字幕在线电影 | 久草在线播放视频 | 国产高清视频在线观看 | 国产午夜精品理论片在线 | 91在线精品播放 | 亚洲第一中文字幕 | 国产精品一区二 | 久久香蕉电影网 | 欧美视频网址 | 久久久免费高清视频 | 亚洲一区视频在线播放 | 日日夜夜天天久久 | 久久亚洲二区 | 午夜精品麻豆 | 久久久久久久久免费 | 日韩av中文字幕在线 | 久久久人 | se视频网址 | 亚洲日本精品 | 中文视频在线看 | 亚洲精品久久久久久久不卡四虎 | 中文字幕字幕中文 | 国产福利不卡视频 | 天天综合人人 | 国产精品二区三区 | 中文字幕在线观看第三页 | 国产精品专区h在线观看 | 五月激情久久 | 成人蜜桃视频 | 国产女人40精品一区毛片视频 | 久久综合久久综合这里只有精品 | 免费观看国产精品 | 天天干一干 | 黄色三级免费网址 | 中文字幕免费高清在线观看 | 97在线播放| 国产 一区二区三区 在线 | 黄色亚洲在线 | 奇米影视四色8888 | 999在线观看视频 | 亚洲视频 在线观看 | 91精品在线看 | 日日操日日 | 91午夜精品 | 六月色婷婷 | 96久久精品 | 欧美日韩性生活 | 一区二区av | 麻豆果冻剧传媒在线播放 | 99精彩视频| 免费看污在线观看 | 亚洲精品66 | 国产黄色看片 | 一区在线免费观看 | 成片免费观看视频999 | 成人国产精品久久久久久亚洲 | 欧美日韩一级视频 | 国产成人精品女人久久久 | 91在线精品一区二区 | 国产玖玖精品视频 | 日韩在线观看视频一区二区三区 | 日韩大片在线免费观看 | 天天综合视频在线观看 | 中文字幕在线播放日韩 | 免费久久99精品国产婷婷六月 | 日韩精选在线 | 在线视频 精品 | 网站免费黄 | 99久久精品网 | 成人久久 | 国产精品理论片 | 成人动漫精品一区二区 | 国产精品成人一区二区 | 日韩欧美国产精品 | 中文字幕久久亚洲 | 综合网伊人 | 99免费在线视频 | 精品一区二区电影 | 亚洲日本成人网 | 成人小视频免费在线观看 | 日韩在线高清视频 | 亚洲精品字幕在线观看 | 国产精品九九久久久久久久 | 免费91麻豆精品国产自产在线观看 | 色综合久久五月 | 99精品视频中文字幕 | 亚洲毛片久久 | 麻豆av一区二区三区在线观看 | 天天操天天草 | 免费在线观看av网址 | 国产高清在线一区 | 国产在线国偷精品产拍 | 免费看的黄色小视频 | 色婷婷激情电影 | 91九色精品女同系列 | 超碰人人在线 | 国产精品久久久久毛片大屁完整版 | www.色午夜| 国产精品porn | 欧美日韩久久不卡 | 国产成人精品免费在线观看 | 久久精品九色 | 天天鲁天天干天天射 | 国产性xxxx| 欧美福利视频 | 黄色免费高清视频 | 免费久久精品视频 | 欧美一级黄色视屏 | 色资源在线 | 日韩精品最新在线观看 | 久久久久久久久久久久久国产精品 | 日韩高清一区 | 欧美午夜a | 91精品国| 亚洲一级在线观看 | 91成人小视频 | 日韩久久在线 | 美女久久久久久久久久久 | 国产精品理论在线观看 | 免费黄色av电影 | 久久精品视频国产 | 中文字幕亚洲精品在线观看 | 日韩av在线网站 | 久久视频精品在线观看 | 日本少妇久久久 | 久久国产精品偷 | 国产黄色片免费观看 | 日日干av | 成人性生交大片免费看中文网站 | 国产精品成人一区 | 国产91全国探花系列在线播放 | 亚洲毛片久久 | 久久久久久久影院 | 亚洲成人资源在线观看 | 久久er99热精品一区二区三区 | 久久天堂精品视频 | 国产亚洲精品久久久久久大师 | 天天干.com | www在线观看国产 | 91欧美国产| 日日夜夜精品免费视频 | 在线视频 你懂得 | 亚洲精品www久久久 www国产精品com | 国产一级小视频 | 亚洲女同videos | 国产 色 | 性色大片在线观看 | 亚洲天天综合网 | 在线视频精品 | 精品人人人 | 久久久国产精品一区二区三区 | 美女黄频免费 | 日本一区二区三区视频在线播放 | 国产在线观看高清视频 | 久久精品免费看 | 亚洲国产高清视频 | 亚洲色图激情文学 | 日韩精品中字 | 亚洲黄色成人网 | 久久久久亚洲国产精品 | 亚洲天天 | 中文字幕第一页在线视频 | 国产精品成人自产拍在线观看 | 亚洲最新视频在线 | 久久久久久久影院 | 99久久国产免费,99久久国产免费大片 | 三级动态视频在线观看 | 日韩精品在线免费观看 | 成人黄性视频 | 美女网站视频免费都是黄 | 免费在线日韩 | 亚洲激情国产精品 | 久久久999精品视频 国产美女免费观看 | 日韩有码中文字幕在线 | 日本三级不卡 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 成人全视频免费观看在线看 | 久久久国产精品一区二区中文 | 色99之美女主播在线视频 | 日韩精品免费一区二区 | 欧美日一级片 | 美女视频黄是免费的 | 亚洲精品久久久久中文字幕m男 | 午夜精品视频一区二区三区在线看 | 国产韩国日本高清视频 | 日韩在线免费看 | 中文字幕大全 | 鲁一鲁影院 | 91精品免费视频 | 久久高清免费视频 | 欧美成人猛片 | 久久国产精品一国产精品 | 人人澡超碰碰 | 国产精品一区二区果冻传媒 | 一区二区三区在线电影 | 日韩一片| 欧美 国产 视频 | 成 人 黄 色视频免费播放 | 国产一区私人高清影院 | 久久不卡免费视频 | 国产视频观看 | 在线国产一区二区三区 | 91精品区| 亚洲 欧洲 国产 日本 综合 | 亚洲资源一区 | 五月丁香| 全黄网站 | a视频免费 | 成人在线一区二区三区 | 亚洲视频h | av三级在线免费观看 | 国产精品久久久久久69 | 激情欧美一区二区三区 | 97精品超碰一区二区三区 | 久精品一区| 日本天天色 | 成人午夜久久 | 婷婷久久网 | 国产中文字幕一区 | 亚洲欧美婷婷六月色综合 | 国产黄色一级片在线 | 91麻豆精品国产91久久久久久 | 看黄色91| 久久久久免费看 | 色成人亚洲 | 国产经典 欧美精品 | 久久久精品综合 | 久久免费av电影 | 成人黄色大片在线免费观看 | 日韩丝袜 | 欧美日韩三级在线观看 | 国产午夜精品久久久久久久久久 | 久久久国产精华液 | 在线导航av| 在线免费观看国产 | 91九色视频在线播放 | 深夜成人av | 免费在线观看污网站 | 在线免费观看视频你懂的 | 日本福利视频在线 | 中文字幕乱码电影 | 插婷婷 | 在线91视频 | 最新91在线视频 | www.黄色片网站 | 中国一级片在线播放 | 久久精品久久久精品美女 | 免费黄色激情视频 | 久草在线免费播放 | 亚洲 欧美日韩 国产 中文 | 久草精品视频在线播放 | 国产亚洲精品久 | 91视频在线免费下载 | 免费黄av| 国产一区在线免费观看 | 手机在线看永久av片免费 | 在线观看成人 | 精品女同一区二区三区在线观看 | 超碰人人射 | 在线观看中文字幕第一页 | 免费高清在线观看成人 | 久久99久久99精品中文字幕 | 国产亚洲成人网 | 91精品国产91久久久久福利 | 片黄色毛片黄色毛片 | 久久国产网站 | 超碰人人射 | 久久久免费精品视频 | 天天干夜夜 | 亚洲人成网站精品片在线观看 | 日韩二区精品 | 美女视频永久黄网站免费观看国产 | 国产精品久久久免费 | 91中文字幕在线视频 | 国产色综合天天综合网 | 国产精品久久久久9999吃药 | 丁五月婷婷 | 免费av在线网 | 西西444www大胆高清图片 | 国产午夜免费视频 | 麻豆国产精品va在线观看不卡 | 久99久精品视频免费观看 | 丁香九月婷婷 | 日韩久久影院 | 亚洲日韩精品欧美一区二区 | 亚洲国产wwwccc36天堂 | 国语对白少妇爽91 | 六月丁香在线视频 | 国产剧情一区二区在线观看 | 久久人人爽人人爽人人 | 国产精品久久久久久一二三四五 | 国产成人三级 | 亚洲欧洲成人精品av97 | 国产在线更新 | 国产一级电影免费观看 | 亚洲激情| 97av在线视频免费播放 | 国产色a在线观看 | 天天射天天操天天 | 日批视频在线 | 久久久久一区二区三区 | 日韩精品一区二区免费 | 在线观看中文字幕第一页 | 久久久国产成人 | 欧美 亚洲 另类 激情 另类 | 在线视频国产区 | 日日夜夜精品免费 | 久久综合狠狠综合久久综合88 | 久久天天躁狠狠躁夜夜不卡公司 | 欧美日韩中文视频 | 麻花豆传媒mv在线观看网站 | 欧美一级性生活视频 | 在线视频欧美精品 | 亚洲精品国产精品99久久 | 狠狠色丁香久久婷婷综合丁香 | 国产va饥渴难耐女保洁员在线观看 | 久草免费在线视频 | 99热99热| 久久久蜜桃 | 日本精品视频在线 | 日本丰满少妇免费一区 | 99九九免费视频 | 久久免费国产精品1 | 国产精品99久久久久人中文网介绍 | 久久精品国产第一区二区三区 | 99在线精品观看 | 国产日韩在线观看一区 | 国产在线精品一区二区 | 亚洲视频在线看 | 国内精品久久久久久久久久清纯 | 免费看黄在线观看 | 91久久久久久国产精品 | 青青久视频 | 97av在线 | av在观看 | 欧美综合久久久 | 成人宗合网 | 涩涩色亚洲一区 | 色诱亚洲精品久久久久久 | 亚洲成a人片在线www | 婷婷在线网 | 超碰公开在线观看 | 欧美精品视 | 欧美性视频网站 | 九九视频免费观看视频精品 | 人人干人人模 | 国产精品入口66mio女同 | av在线一 | 在线欧美最极品的av | 黄色小说视频在线 | 91字幕 | 国产高清视频在线观看 | 美女网站在线免费观看 | 激情在线免费视频 | 一区二区免费不卡在线 | 亚洲在线日韩 | 国产视频中文字幕在线观看 | 黄在线免费看 | www夜夜操com| 中文字幕视频播放 | 日韩成人精品在线观看 | 欧洲一区精品 | 日韩欧美有码在线 | 久久久久久久久久影院 | 久久久久欠精品国产毛片国产毛生 | 久久99精品国产麻豆婷婷 | 99在线视频免费观看 | 嫩草av影院| 久久久久久美女 | 91精品国产九九九久久久亚洲 | 国产精品网红直播 | 日韩二区在线 | 国产视频18 | 亚洲成aⅴ人在线观看 | 久久精精品视频 | 嫩模bbw搡bbbb搡bbbb | 四虎www com| 一区二区三区高清不卡 | 成人小视频在线观看免费 | 午夜成人免费电影 | 国产在线成人 | 国产在线美女 | 欧美乱淫视频 | 九九久久久久久久久激情 | 欧美高清视频不卡网 | 婷色在线 | 久久夜色网 | 伊人伊成久久人综合网站 | 热久久国产精品 | 色资源网在线观看 | 亚洲色图激情文学 | 在线中文字幕一区二区 | 国产色道| 国产最顶级的黄色片在线免费观看 | 色婷婷视频 | 成全免费观看视频 | 天天色天天草天天射 | 日韩性xxxx| 在线观看完整版免费 | 免费国产亚洲视频 | 国产精品黄色 | 一区av在线播放 | 午夜婷婷网 | 日韩视频免费 | 极品嫩模被强到高潮呻吟91 | 欧美一区二区伦理片 | 久久人人干 | 韩国三级一区 | 国产精品久久久久久久久免费看 | 午夜国产福利在线 | 91最新国产| 久久国产影视 | 主播av在线 | 偷拍区另类综合在线 | 亚洲网站在线 | 最近更新的中文字幕 | 人人干人人干人人干 | 国产国语在线 | 日韩首页 | 天天综合网在线 | 久久精品视频3 | 91精品国产99久久久久 | 亚洲精品美女久久久 | 亚洲国产成人精品在线观看 | 一区二区三区手机在线观看 | 国产九九热 | 精品国产视频在线观看 | 日韩影视在线观看 | 99在线免费观看 | 国产999在线 | 欧美一级日韩免费不卡 | 九九热免费在线视频 | 久草在在线视频 | 国产精品第72页 | 在线观看黄色av | av电影中文字幕在线观看 | 99精品视频在线观看视频 | 天天色棕合合合合合合 | 亚洲成av人片在线观看无 | 丝袜美腿亚洲 | 国产打女人屁股调教97 | 日韩综合视频在线观看 | 在线免费av电影 | a级国产乱理论片在线观看 伊人宗合网 | 最新日韩视频在线观看 | av成人资源 | 亚洲 欧洲 国产 精品 | 精品美女久久 | 国产精品大片免费观看 | 中文字幕在线久一本久 | 国产夫妻av在线 | 久久综合九色综合久99 | 国产午夜在线 | 欧美国产一区在线 | 中文字幕你懂的 | 97色在线观看免费视频 | 超碰97人人干 | 美女网站色在线观看 | 久久久久成人精品亚洲国产 | 国产一区欧美日韩 | 国产99在线免费 | 日韩在线视频看看 | 中文字幕一区二区三区视频 | 欧美一级片免费播放 | 免费的国产精品 | 天天插日日插 | 九九交易行官网 | 丁香婷婷色月天 | 久热色超碰 | 97在线视频免费观看 | 91在线成人 | 中文字幕一区二区三区乱码不卡 | 黄毛片在线观看 | av中文字幕电影 | 一区中文字幕电影 | 播五月综合 | 久久久综合电影 | 欧美一区,二区 | 一区电影 | 日韩有码在线播放 | 视频二区在线视频 | 色综合久久久久综合体桃花网 | 最近中文字幕久久 | 91热这里只有精品 | av成人免费观看 | 亚洲精品欧美视频 | 一区二精品 | 中文字幕在线观看免费 | 97国产在线视频 | 亚洲精品一区二区久 | 丰满少妇在线观看资源站 | 97视频一区 | 毛片美女网站 | 成人黄色av网站 | 久久亚洲综合国产精品99麻豆的功能介绍 | 日韩精品一卡 | 久久久久久电影 | 亚洲国产精品电影在线观看 | 99精品99| 操操操影院 | 国产精品av在线免费观看 | 欧美视频日韩视频 | 麻豆视频免费播放 | 成人小视频在线观看免费 | 日韩一级成人av | 天天爱天天操 | 全黄网站 | 亚洲禁18久人片 | 国产精品99蜜臀久久不卡二区 | 免费三级影片 | 精品久久久久久综合日本 | 国产精品一区二区三区久久久 | 成人黄色免费在线观看 | 国产最新视频在线观看 | 国产做a爱一级久久 | 国产亚洲精品免费 | 蜜臀久久99精品久久久无需会员 | www成人精品| 国产日韩中文字幕在线 | 欧美激情综合五月色丁香 | 欧美激情综合五月色丁香 | 免费观看一级 | 成年人免费看片 | 日本久久中文字幕 | 久久一及片 | 日韩成人免费在线电影 | 日韩aⅴ视频 | 天天色天天操综合 | 日韩69av | 成人在线播放av | 97色婷婷成人综合在线观看 | 中文字幕欧美日韩va免费视频 | 粉嫩av一区二区三区免费 | 97天堂网 | 成人宗合网 | 国产手机视频在线播放 | 最近日本中文字幕a | 国产日韩视频在线播放 | 日韩中字在线观看 | 最新精品视频在线 | 亚洲精品在线观看视频 | 天天曰天天射 | 91精选 | 午夜电影中文字幕 | www日日| 色吧av色av | www.av在线.com| 日韩日韩日韩日韩 | 亚洲精品一区二区三区高潮 | 丁香婷婷激情网 | 欧美一级性生活视频 | 激情综合啪啪 | 日韩在线观看的 | 天天干天天碰 | 国内精品在线观看视频 | 中文免费观看 | 9ⅰ精品久久久久久久久中文字幕 | 激情自拍av | 一区电影 | 激情视频一区 | 成人黄色电影视频 | 国产在线成人 | 久久精彩 | 亚洲成人第一区 | 久久久久观看 | 亚洲91中文字幕无线码三区 | 99精品视频在线观看视频 | 日本精品视频在线 | 午夜精品一区二区三区免费视频 | 91视频三区 | 国产精品成久久久久三级 | 欧洲色吧 | 午夜12点 | 精品电影一区 | 日韩欧美高清视频在线观看 | 黄色一级大片在线免费看产 | 成人一级片视频 | 国产91免费看 | 超碰在线人人艹 | 91精品国自产在线观看 | 国产高清中文字幕 | 国产资源在线视频 | 欧美日韩精品在线视频 | 久久久久久久电影 | 午夜精品久久久久久久久久久久久久 | 特黄特黄的视频 | 免费日韩 精品中文字幕视频在线 | 2023亚洲精品国偷拍自产在线 | 又色又爽的网站 | 日韩欧美高清不卡 | 在线 成人 | 日韩av网站在线播放 | 99中文视频在线 | 久久综合操| 精品九九九九 | 青青河边草手机免费 | 欧美国产亚洲精品久久久8v | av免费福利 | 狠狠久久综合 | 人人看97 | 国产精品欧美日韩在线观看 | 偷拍精偷拍精品欧洲亚洲网站 | 久久亚洲福利视频 | 久久精品国产免费看久久精品 | 成人黄色在线播放 | 国产高清在线看 | 国产美女永久免费 | 99视频在线免费 | 五月婷婷丁香在线观看 | 天天躁日日躁狠狠躁 | 麻豆国产露脸在线观看 | 97在线视频免费观看 | 欧美乱淫视频 | 在线观看视频亚洲 | 91porny九色91啦中文 | 一区 二区电影免费在线观看 | 亚洲精品理论片 | 欧美日韩精品二区第二页 | 国产精品视频久久久 | 亚洲一级黄色片 | 国产黄网在线 | 天天综合91 | 国产又粗又猛又黄视频 | 一区二区三区在线观看 | 国产精品久久久久久久免费大片 | 视频福利在线观看 | 婷婷丁香狠狠爱 | 国产精品亚洲a | 久久av网 | 久久精品视频在线观看 | 91黄色视屏 | 久免费视频 | 亚洲人人精品 | 最近日韩中文字幕中文 | 色网免费观看 | 国产美女精品视频 | 看片的网址 | 久久人人精| 美女久久精品 | 四虎在线视频免费观看 | 麻豆视频观看 | 亚洲天堂精品 | 国产又粗又猛又爽又黄的视频先 | 国产福利精品视频 | 日韩久久久久久久 | 日韩色爱 | 日本精品午夜 | 亚洲综合色av | 国产女人40精品一区毛片视频 | 国产精品乱码久久 | 黄色精品久久久 | 成年人视频在线免费 | 国产精品久久久久久爽爽爽 | 日本乱视频 | 免费看片网页 | 中文字幕在线视频免费播放 | 午夜av一区二区三区 | 激情丁香久久 | 亚洲天堂精品视频在线观看 | 91入口在线观看 | 久日精品 | 欧美人操人 | 久久久亚洲精华液 | 国产一区免费 | 91在线免费观看国产 | 在线观看的av | 日本中文一区二区 | 欧美一区二视频在线免费观看 | 一级黄色片在线免费看 | 亚洲综合在 | 在线a视频免费观看 | 丁香影院在线 | 亚洲视频综合在线 | 在线国产专区 | 日韩 在线| 天天操天天谢 | www.天天色.com | 国产一区在线精品 | 91精品资源 | 欧美电影在线观看 | 亚洲国产精品日韩 | 国产视频一区在线播放 | 一区三区视频 | 精品久久久久久综合 | 黄色毛片视频免费 | 国产精品白浆视频 | 国产亚洲精品久久久久动 | 四虎国产精品成人免费4hu | 日日夜夜精品免费 | 69xx视频 | 91丨porny丨九色 | 97成人在线免费视频 | 天天操天天干天天爽 | 国产精品自产拍在线观看网站 | 国产麻豆精品一区二区 | 国产精品手机视频 | 精品国产免费看 | 91一区啪爱嗯打偷拍欧美 | 日韩伦理一区二区三区av在线 | 国产精品免费久久久久久久久久中文 | 99国产成+人+综合+亚洲 欧美 | 欧美精品乱码久久久久久 | 日韩中文字幕免费视频 | 成年人视频在线观看免费 | 成人在线免费av | 91亚洲国产成人久久精品网站 | 99热最新在线 | 久久99热这里只有精品 | 天天干,夜夜操 | a级片久久| 青青河边草免费观看完整版高清 | 能在线观看的日韩av | 中文国产成人精品久久一 | 久草在线视频中文 | 国产高清综合 | 精品亚洲成a人在线观看 | 日韩在线网 | av成人在线看 | 国产婷婷vvvv激情久 | 精品亚洲成a人在线观看 | 国产三级香港三韩国三级 | 国产精品一区二区果冻传媒 | 九九免费精品 | 亚洲精品乱码久久久久久蜜桃不爽 | 超碰97网站 | 天天操天天摸天天射 | 国产美女黄网站免费 | 精品视频在线视频 | 97超碰网 | 香蕉成人在线视频 | 国产视频中文字幕在线观看 | 98涩涩国产露脸精品国产网 | 久久久国产一区 | 国产在线视频一区二区三区 | 成年人网站免费在线观看 | 九色精品免费永久在线 | 欧美综合国产 | 亚洲综合网站在线观看 | 亚洲精品h | 久久艹国产视频 | 91九色精品女同系列 | 超碰免费在线公开 | 亚洲欧美日本一区二区三区 | 五月婷婷丁香激情 | 国产一级淫片免费看 | 婷婷丁香在线视频 | 成人一级在线 | 久热久草在线 | 久久久精品免费看 | 久久超碰在线 | 香蕉网站在线观看 | 成人久久精品视频 | 日韩欧美视频一区二区三区 | 欧美日韩国产精品爽爽 | 日本中文字幕电影在线免费观看 | 精品一区二区三区在线播放 | 亚洲精品在线视频网站 | 在线 高清 中文字幕 | 日韩理论电影在线观看 | 亚洲成年人在线播放 | 日韩在线视 | 成年人免费观看在线视频 | 国产精品毛片久久久 | 国产婷婷在线观看 | 四虎国产永久在线精品 | 99se视频在线观看 | 国产一区国产二区在线观看 | 玖玖色在线观看 | 综合网久久 | 中文字幕在线观看网站 | 精品在线你懂的 | 国产不卡免费 | 成年人免费在线观看网站 | 久久免费视频这里只有精品 | 永久免费精品视频 | 欧美精品中文在线免费观看 | 九九在线播放 | 久久在线影院 | 少妇性xxx | 精品久久九九 | 美女视频黄频 | 久久国产美女 | 久久综合网色—综合色88 | 69av国产| 成人一级片在线观看 | 日韩天天综合 | 亚洲欧洲久久久 | 欧洲不卡av| 日韩精品久久久久久中文字幕8 | 91成熟丰满女人少妇 | 久久久免费少妇 | 亚洲在线色 | 国产免费成人 | 久久永久免费视频 | 久久国内免费视频 | 亚洲日本黄色 | 国产精品99久久久久久久久久久久 | 免费视频一区 | 中文在线字幕免费观 | 免费看污网站 | 国产亚洲精品综合一区91 | 欧美大荫蒂xxx | 黄色av一区二区 | 免费看v片| 91色在线观看 | 亚洲欧美日韩国产精品一区午夜 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 少妇bbw揉bbb欧美 | 在线看的av网站 | 日本成人黄色片 | 久久视频免费看 | 成人一级片免费看 | 免费看久久 | 日韩在线观看三区 | 久久全国免费视频 | 国产不卡精品视频 | 99视频免费| 中文字幕888| 国产成人综 | 亚洲免费一级电影 | 亚洲自拍偷拍色图 | 久草在线电影网 | 中文字幕在线视频网站 | 丁香免费视频 | 91麻豆精品国产91 | 久久免费黄色网址 | 欧美色综合天天久久综合精品 | 精品国产黄色片 | 欧美污网站 | 夜夜躁狠狠燥 | 国产原创av在线 | 中文字幕一区二区三区四区在线视频 | av解说在线 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 国产免费区 | 一区二区 精品 | 99热在线免费观看 | 国产拍揄自揄精品视频麻豆 | 日本福利视频在线 | 伊人看片 | 中文字幕第一页av | 久久国语露脸国产精品电影 | 黄av免费在线观看 | 波多野结衣视频一区二区 | 黄色特级片 | 激情久久伊人 | 色婷婷啪啪免费在线电影观看 | 久久艹人人 | 热热热热热色 | 天天干夜夜爱 | 色综合久久88色综合天天人守婷 | 欧美久久久久久久久久久久 | 欧美日韩三级在线观看 | 国产亚洲精品久久久久久久久久 | 国产一级一级国产 | av中文字幕在线免费观看 | 午夜手机电影 | 国产高清av在线播放 | 精品亚洲国产视频 | 亚洲一区二区三区毛片 | www.xxx.性狂虐 | 91视频在线观看大全 | 欧美三级高清 | 久久午夜精品影院一区 | 日本公妇色中文字幕 | 天堂av官网 | 国产精品成人久久 | 久久y| 国产91在线观看 | 色综合久久久久综合体桃花网 | 免费av成人在线 | 国产最顶级的黄色片在线免费观看 | 亚洲精品国偷自产在线91正片 | 一区二区不卡在线观看 | 日韩视频免费观看高清完整版在线 | 精品国产免费av | 九色视频网站 | 久久精品网站免费观看 | 国产成人久久精品亚洲 | 久久综合色综合88 | 极品嫩模被强到高潮呻吟91 | 97超级碰碰碰视频在线观看 | 91探花在线视频 | 成人久久久久久久久 | 天天躁天天躁天天躁婷 | 精品福利国产 | 99精品视频免费观看 | 超碰97中文 |