生活随笔
收集整理的這篇文章主要介紹了
select read write
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
轉(zhuǎn)載:http://blog.csdn.net/beginning1126/article/details/8057498
[cpp]?view plaincopy
<p?style="color:?rgb(51,?51,?51);?font-family:?Arial;?font-size:?14px;?line-height:?26px;?text-align:?left;?"><span?style="font-size:14px;?"><strong>1.?服務(wù)器</strong></span></p><p?style="color:?rgb(51,?51,?51);?font-family:?Arial;?font-size:?14px;?line-height:?26px;?text-align:?left;?">?當(dāng)有新連接來的時候,通過在select上輪循寫的fd(文件描述符)發(fā)送一句歡迎詞。然后每次受到客戶端的數(shù)據(jù)后,把接受到的數(shù)據(jù)返回給客戶端。演示了在select上輪循寫的操作。</p><p?style="color:?rgb(51,?51,?51);?font-family:?Arial;?font-size:?14px;?line-height:?26px;?text-align:?left;?">對于監(jiān)視讀操作,只有當(dāng)數(shù)據(jù)來的時候,讀操作的fd才會返回.而對于寫的操作fd,則是輪詢。</p>??
[cpp]?view plaincopy
? ? ? ?? #include?<stdio.h>??? #include?<stdlib.h>??? #include?<errno.h>??? #include?<string.h>??? #include?<netdb.h>??? #include?<sys/types.h>??? #include?<netinet/in.h>??? #include?<sys/socket.h>??? #include?<sys/time.h>?? typedef?int?SOCKET;?? #define?MAXBUFSIZE?1024?? #define?NLISTEN?1024?? #define?isvalidsock(s)??(?(?s?)?>?0?)?? void?set_address(?char?*hname,?char?*sname,struct?sockaddr_in?*sap,?char?*protocol?)?? {?? ????struct?servent?*sp;?? ????struct?hostent?*hp;?? ????char?*endptr;?? ????short?port;?? ?? ????bzero(?sap,?sizeof(?*sap?)?);?? ????sap->sin_family?=?AF_INET;?? ????if?(?hname?!=?NULL?)?? ????{?? ????????if?(?!inet_aton(?hname,?&sap->sin_addr?)?)?? ????????{?? ????????????hp?=?gethostbyname(?hname?);?? ????????????if?(?hp?==?NULL?)?? ????????????????error(?1,?0,?"unknown?host:?%s/n",?hname?);?? ????????????sap->sin_addr?=?*(?struct?in_addr?*?)hp->h_addr;?? ????????}?? ????}?? ????else?? ????????sap->sin_addr.s_addr?=?htonl(?INADDR_ANY?);?? ????port?=?strtol(?sname,?&endptr,?0?);?? ????if?(?*endptr?==?'/0'?)?? ????????sap->sin_port?=?htons(?port?);?? ????else?? ????{?? ????????sp?=?getservbyname(?sname,?protocol?);?? ????????if?(?sp?==?NULL?)?? ????????????error(?1,?0,?"unknown?service:?%s/n",?sname?);?? ????????sap->sin_port?=?sp->s_port;?? ????}?? }?? ?? SOCKET?tcp_server(?char?*hname,?char?*sname?)?? {?? ????struct?sockaddr_in?local;?? ????SOCKET?s;?? ????const?int?on?=?1;?? ?? ????set_address(?hname,?sname,?&local,?"tcp"?);?? ????s?=?socket(?AF_INET,?SOCK_STREAM,?0?);?? ????if?(?!isvalidsock(?s?)?)?? ????????error(?1,?errno,?"socket?call?failed"?);?? ?? ????if?(?setsockopt(?s,?SOL_SOCKET,?SO_REUSEADDR,?? ????????(?char?*?)&on,?sizeof(?on?)?)?)?? ????????error(?1,?errno,?"setsockopt?failed"?);?? ?? ????if?(?bind(?s,?(?struct?sockaddr?*?)?&local,?? ?????????sizeof(?local?)?)?)?? ????????error(?1,?errno,?"bind?failed"?);?? ?? ????if?(?listen(?s,?NLISTEN?)?)?? ????????error(?1,?errno,?"listen?failed"?);?? ?? ????return?s;?? }?? ?? ?? ?? int?main(int?argc,char**argv)?? {?? ???int?i,maxi,maxfd,listenfd,connfd,sockfd;?? ???int?nready,client[FD_SETSIZE];?? ???fd_set?rset,alllset,wset,wsetsave;?? ???char?buf[MAXBUFSIZE];?? ???socklen_t?clilen;?? ???struct?sockaddr_in?servaddr,cliaddr;?? ???int?rval;?? ???struct?timeval?to;?? ???int?n?=?0;?? ???listenfd?=??tcp_server(NULL,"5000");?? ?? ?? ???FD_ZERO(&alllset);?? ???FD_ZERO(&wsetsave);?? ???FD_SET(listenfd,&alllset);?? ???maxfd?=?listenfd;?? ???for(i?=?0;?i?<?FD_SETSIZE;i++)?? ???????client[i]?=?-1;?? ???maxi?=?-1;?? ???while(1)?? ???{?? ????FD_ZERO(&rset);?? ????????rset?=?alllset;?? ????wset?=?wsetsave;?? ????printf("server?waiting...,maxfd:%d/n",maxfd);?? ????nready?=?select(maxfd+1,&rset,&wset,NULL,NULL);?? ????if(FD_ISSET(listenfd,&rset))?? ????{?? ???????clilen?=?sizeof(cliaddr);?? ???????connfd?=?accept(listenfd,(struct?sockaddr*)&cliaddr,&clilen);?? ???????for(i?=?0;?i<?FD_SETSIZE;?i++)?? ???????????{?? ???????????if(client[i]?<?0)?? ???????????{?? ????????????????????????client[i]?=?connfd;?? ????????????break;?? ???????????}?? ???????}?? ???????if(i?==?FD_SETSIZE)?? ???????{?? ??????????????printf("too?many?clients?/n");?? ??????????????exit(1);?? ???????}?? ???????????FD_SET(connfd,&alllset);?? ???????FD_SET(connfd,&wsetsave);?? ???????printf("addinng?client?on?fd?%d/n",connfd);?? ???????if(connfd?>?maxfd)?? ??????????????maxfd?=?connfd;?? ???????if(?i?>?maxi)?? ???????????????maxi?=?i;?? ???????if(--nready?<=?0)?? ????????????????continue;?? ??????? ???????}?? ???????for(i?=?0;?i?<=?maxi;?i++)?? ???????{?? ???????????if((sockfd?=?client[i])?<?0?)?? ??????????continue;?? ??????if(FD_ISSET(sockfd,&rset))?? ??????{?? ??????????????bzero(buf,100);?? ??????????????if((n?=?recv(sockfd,buf,MAXBUFSIZE,0))?<=?0)?? ??????????{?? ??????????????????close(sockfd);?? ????????????FD_CLR(sockfd,&alllset);?? ????????????client[i]?=?-1;?? ????????????printf("recv?error,client:%d?exit/n",sockfd);?? ???????????? ??????????}?? ??????????else?? ??????????{?? ??????????????????sleep(2);?? ??????????????????printf("serving?client?read?on?fd?%d,recv?datalen:?%d,data:%s?/n",sockfd,n,buf);?? ??????????write(sockfd,buf,n);?? ??????????}?? ??????????if(--nready?<=?0?)?? ??????????break;?????? ?? ??????????}?? ??????else?if(FD_ISSET(sockfd,&wset))?? ??????{?? ??????????????char?buf1[100]?=?{""};?? ??????????????sprintf(buf1,"Welcome?the?selectsvr?.../n");?? ??????????????if((n?=?send(sockfd,buf1,strlen(buf1),0))?<=?0)?? ??????????????{?? ???????????????????close(sockfd);?? ???????????FD_CLR(sockfd,&wsetsave);?? ???????????printf("send?error,client:%d?exit/n",sockfd);?? ??????????}?? ??????????else?? ??????????{?? ???????????????????FD_CLR(sockfd,&wsetsave);?? ???????????????????printf("serving?client?write?on?fd?%d,data:%s/n",sockfd,buf1);?? ??????????}?? ??????????sleep(5);?? ??????}?? ?? ????}?? ??}??? ?? }??
[cpp]?view plaincopy
<span?style="color:?rgb(51,?51,?51);?font-family:?Arial;?font-size:?14px;?line-height:?26px;?">通過:?gcc?selectsvr.c?-o?selectsvr?編譯得到執(zhí)行文件selectsvr</span>??
[cpp]?view plaincopy
<span?style="color:?rgb(51,?51,?51);?font-family:?Arial;?font-size:?14px;?line-height:?26px;?"><span?style="color:?rgb(51,?51,?51);?font-family:?Arial;?line-height:?26px;?text-align:?left;font-size:14px;?">?2.?客戶端</span>?? </span>??
[cpp]?view plaincopy
? ? ? ?? #include?<stdio.h>??? #include?<stdlib.h>??? #include?<errno.h>??? #include?<string.h>??? #include?<netdb.h>??? #include?<sys/types.h>??? #include?<netinet/in.h>??? #include?<sys/socket.h>??? #include?<sys/time.h>?? typedef?int?SOCKET;?? #define?MAXBUFSIZE?1024?? #define?NLISTEN?1024?? #define?isvalidsock(s)??(?(?s?)?>?0?)?? void?set_address(?char?*hname,?char?*sname,struct?sockaddr_in?*sap,?char?*protocol?)?? {?? ????struct?servent?*sp;?? ????struct?hostent?*hp;?? ????char?*endptr;?? ????short?port;?? ?? ????bzero(?sap,?sizeof(?*sap?)?);?? ????sap->sin_family?=?AF_INET;?? ????if?(?hname?!=?NULL?)?? ????{?? ????????if?(?!inet_aton(?hname,?&sap->sin_addr?)?)?? ????????{?? ????????????hp?=?gethostbyname(?hname?);?? ????????????if?(?hp?==?NULL?)?? ????????????????error(?1,?0,?"unknown?host:?%s/n",?hname?);?? ????????????sap->sin_addr?=?*(?struct?in_addr?*?)hp->h_addr;?? ????????}?? ????}?? ????else?? ????????sap->sin_addr.s_addr?=?htonl(?INADDR_ANY?);?? ????port?=?strtol(?sname,?&endptr,?0?);?? ????if?(?*endptr?==?'/0'?)?? ????????sap->sin_port?=?htons(?port?);?? ????else?? ????{?? ????????sp?=?getservbyname(?sname,?protocol?);?? ????????if?(?sp?==?NULL?)?? ????????????error(?1,?0,?"unknown?service:?%s/n",?sname?);?? ????????sap->sin_port?=?sp->s_port;?? ????}?? }?? ?? ?? SOCKET?tcp_client(?char?*hname,?char?*sname?)?? {?? ????struct?sockaddr_in?peer;?? ????SOCKET?s;?? ?? ????set_address(?hname,?sname,?&peer,?"tcp"?);?? ????s?=?socket(?AF_INET,?SOCK_STREAM,?0?);?? ????if?(?!isvalidsock(?s?)?)?? ????????error(?1,?errno,?"socket?call?failed"?);?? ?? ????if?(?connect(?s,?(?struct?sockaddr?*?)&peer,?? ?????????sizeof(?peer?)?)?)?? ????????error(?1,?errno,?"connect?failed"?);?? ?? ????return?s;?? }?? ?? ?? int?main(int?argc,char**argv)?? {?? ???SOCKET?s;?? ???s?=?tcp_client(NULL,"5000");?? ???char?buf[100]?=?{""};?? ???recv(s,buf,100,0);?? ???printf("%s/n",buf);?? ???printf("please?input?data(quit?exit):");?? ???while(fgets(buf,100,stdin)?!=?NULL)?? ???{?? ????????if(strcmp(buf,"quit")?==?0)?? ????????????break;?? ????????send(s,buf,strlen(buf),0);?? ????????recv(s,buf,100,0);?? ????????printf("echo?data:%s/n",buf);?? ????????printf("please?input?data(quit?exit):");?? ???}?? ????? }??
通過: gcc selectcli.c -o selectcli 得到客戶端執(zhí)行程序.
? 在上面的測試?yán)又?程序只是簡單演示了如何使用select來輪詢可讀、可寫操作的。
總結(jié)
以上是生活随笔為你收集整理的select read write的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。