select read write

轉載:http://blog.csdn.net/beginning1126/article/details/8057498

[cpp]?view plaincopy
  1. <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.?服務器</strong></span></p><p?style="color:?rgb(51,?51,?51);?font-family:?Arial;?font-size:?14px;?line-height:?26px;?text-align:?left;?">?當有新連接來的時候,通過在select上輪循寫的fd(文件描述符)發送一句歡迎詞。然后每次受到客戶端的數據后,把接受到的數據返回給客戶端。演示了在select上輪循寫的操作。</p><p?style="color:?rgb(51,?51,?51);?font-family:?Arial;?font-size:?14px;?line-height:?26px;?text-align:?left;?">對于監視讀操作,只有當數據來的時候,讀操作的fd才會返回.而對于寫的操作fd,則是輪詢。</p>??
[cpp]?view plaincopy
  1. /*?
  2. ?the?example?is?writed?by?minrongf,date:?20090214?
  3. #filename:?selectsvr.c?
  4. ?*?*/??
  5. #include?<stdio.h>???
  6. #include?<stdlib.h>???
  7. #include?<errno.h>???
  8. #include?<string.h>???
  9. #include?<netdb.h>???
  10. #include?<sys/types.h>???
  11. #include?<netinet/in.h>???
  12. #include?<sys/socket.h>???
  13. #include?<sys/time.h>??
  14. typedef?int?SOCKET;??
  15. #define?MAXBUFSIZE?1024??
  16. #define?NLISTEN?1024??
  17. #define?isvalidsock(s)??(?(?s?)?>?0?)??
  18. void?set_address(?char?*hname,?char?*sname,struct?sockaddr_in?*sap,?char?*protocol?)??
  19. {??
  20. ????struct?servent?*sp;??
  21. ????struct?hostent?*hp;??
  22. ????char?*endptr;??
  23. ????short?port;??
  24. ??
  25. ????bzero(?sap,?sizeof(?*sap?)?);??
  26. ????sap->sin_family?=?AF_INET;??
  27. ????if?(?hname?!=?NULL?)??
  28. ????{??
  29. ????????if?(?!inet_aton(?hname,?&sap->sin_addr?)?)??
  30. ????????{??
  31. ????????????hp?=?gethostbyname(?hname?);??
  32. ????????????if?(?hp?==?NULL?)??
  33. ????????????????error(?1,?0,?"unknown?host:?%s/n",?hname?);??
  34. ????????????sap->sin_addr?=?*(?struct?in_addr?*?)hp->h_addr;??
  35. ????????}??
  36. ????}??
  37. ????else??
  38. ????????sap->sin_addr.s_addr?=?htonl(?INADDR_ANY?);??
  39. ????port?=?strtol(?sname,?&endptr,?0?);??
  40. ????if?(?*endptr?==?'/0'?)??
  41. ????????sap->sin_port?=?htons(?port?);??
  42. ????else??
  43. ????{??
  44. ????????sp?=?getservbyname(?sname,?protocol?);??
  45. ????????if?(?sp?==?NULL?)??
  46. ????????????error(?1,?0,?"unknown?service:?%s/n",?sname?);??
  47. ????????sap->sin_port?=?sp->s_port;??
  48. ????}??
  49. }??
  50. ??
  51. SOCKET?tcp_server(?char?*hname,?char?*sname?)??
  52. {??
  53. ????struct?sockaddr_in?local;??
  54. ????SOCKET?s;??
  55. ????const?int?on?=?1;??
  56. ??
  57. ????set_address(?hname,?sname,?&local,?"tcp"?);??
  58. ????s?=?socket(?AF_INET,?SOCK_STREAM,?0?);??
  59. ????if?(?!isvalidsock(?s?)?)??
  60. ????????error(?1,?errno,?"socket?call?failed"?);??
  61. ??
  62. ????if?(?setsockopt(?s,?SOL_SOCKET,?SO_REUSEADDR,??
  63. ????????(?char?*?)&on,?sizeof(?on?)?)?)??
  64. ????????error(?1,?errno,?"setsockopt?failed"?);??
  65. ??
  66. ????if?(?bind(?s,?(?struct?sockaddr?*?)?&local,??
  67. ?????????sizeof(?local?)?)?)??
  68. ????????error(?1,?errno,?"bind?failed"?);??
  69. ??
  70. ????if?(?listen(?s,?NLISTEN?)?)??
  71. ????????error(?1,?errno,?"listen?failed"?);??
  72. ??
  73. ????return?s;??
  74. }??
  75. ??
  76. ??
  77. ??
  78. int?main(int?argc,char**argv)??
  79. {??
  80. ???int?i,maxi,maxfd,listenfd,connfd,sockfd;??
  81. ???int?nready,client[FD_SETSIZE];??
  82. ???fd_set?rset,alllset,wset,wsetsave;??
  83. ???char?buf[MAXBUFSIZE];??
  84. ???socklen_t?clilen;??
  85. ???struct?sockaddr_in?servaddr,cliaddr;??
  86. ???int?rval;??
  87. ???struct?timeval?to;??
  88. ???int?n?=?0;??
  89. ???listenfd?=??tcp_server(NULL,"5000");??
  90. ??
  91. ??
  92. ???FD_ZERO(&alllset);??
  93. ???FD_ZERO(&wsetsave);??
  94. ???FD_SET(listenfd,&alllset);??
  95. ???maxfd?=?listenfd;??
  96. ???for(i?=?0;?i?<?FD_SETSIZE;i++)??
  97. ???????client[i]?=?-1;??
  98. ???maxi?=?-1;??
  99. ???while(1)??
  100. ???{??
  101. ????FD_ZERO(&rset);??
  102. ????????rset?=?alllset;??
  103. ????wset?=?wsetsave;??
  104. ????printf("server?waiting...,maxfd:%d/n",maxfd);??
  105. ????nready?=?select(maxfd+1,&rset,&wset,NULL,NULL);??
  106. ????if(FD_ISSET(listenfd,&rset))??
  107. ????{??
  108. ???????clilen?=?sizeof(cliaddr);??
  109. ???????connfd?=?accept(listenfd,(struct?sockaddr*)&cliaddr,&clilen);??
  110. ???????for(i?=?0;?i<?FD_SETSIZE;?i++)??
  111. ???????????{??
  112. ???????????if(client[i]?<?0)??
  113. ???????????{??
  114. ????????????????????????client[i]?=?connfd;??
  115. ????????????break;??
  116. ???????????}??
  117. ???????}??
  118. ???????if(i?==?FD_SETSIZE)??
  119. ???????{??
  120. ??????????????printf("too?many?clients?/n");??
  121. ??????????????exit(1);??
  122. ???????}??
  123. ???????????FD_SET(connfd,&alllset);??
  124. ???????FD_SET(connfd,&wsetsave);??
  125. ???????printf("addinng?client?on?fd?%d/n",connfd);??
  126. ???????if(connfd?>?maxfd)??
  127. ??????????????maxfd?=?connfd;??
  128. ???????if(?i?>?maxi)??
  129. ???????????????maxi?=?i;??
  130. ???????if(--nready?<=?0)??
  131. ????????????????continue;??
  132. ???????
  133. ???????}??
  134. ???????for(i?=?0;?i?<=?maxi;?i++)??
  135. ???????{??
  136. ???????????if((sockfd?=?client[i])?<?0?)??
  137. ??????????continue;??
  138. ??????if(FD_ISSET(sockfd,&rset))??
  139. ??????{??
  140. ??????????????bzero(buf,100);??
  141. ??????????????if((n?=?recv(sockfd,buf,MAXBUFSIZE,0))?<=?0)??
  142. ??????????{??
  143. ??????????????????close(sockfd);??
  144. ????????????FD_CLR(sockfd,&alllset);??
  145. ????????????client[i]?=?-1;??
  146. ????????????printf("recv?error,client:%d?exit/n",sockfd);??
  147. ????????????
  148. ??????????}??
  149. ??????????else??
  150. ??????????{??
  151. ??????????????????sleep(2);??
  152. ??????????????????printf("serving?client?read?on?fd?%d,recv?datalen:?%d,data:%s?/n",sockfd,n,buf);??
  153. ??????????write(sockfd,buf,n);??
  154. ??????????}??
  155. ??????????if(--nready?<=?0?)??
  156. ??????????break;??????
  157. ??
  158. ??????????}??
  159. ??????else?if(FD_ISSET(sockfd,&wset))??
  160. ??????{??
  161. ??????????????char?buf1[100]?=?{""};??
  162. ??????????????sprintf(buf1,"Welcome?the?selectsvr?.../n");??
  163. ??????????????if((n?=?send(sockfd,buf1,strlen(buf1),0))?<=?0)??
  164. ??????????????{??
  165. ???????????????????close(sockfd);??
  166. ???????????FD_CLR(sockfd,&wsetsave);??
  167. ???????????printf("send?error,client:%d?exit/n",sockfd);??
  168. ??????????}??
  169. ??????????else??
  170. ??????????{??
  171. ???????????????????FD_CLR(sockfd,&wsetsave);??
  172. ???????????????????printf("serving?client?write?on?fd?%d,data:%s/n",sockfd,buf1);??
  173. ??????????}??
  174. ??????????sleep(5);??
  175. ??????}??
  176. ??
  177. ????}??
  178. ??}???
  179. ??
  180. }??
[cpp]?view plaincopy
  1. <span?style="color:?rgb(51,?51,?51);?font-family:?Arial;?font-size:?14px;?line-height:?26px;?">通過:?gcc?selectsvr.c?-o?selectsvr?編譯得到執行文件selectsvr</span>??
[cpp]?view plaincopy
  1. <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>??
  2. </span>??
[cpp]?view plaincopy
  1. /*?
  2. ?the?example?is?writed?by?minrongf,date:?20090214?
  3. #filename:selectcli.c?
  4. ?*?*/??
  5. #include?<stdio.h>???
  6. #include?<stdlib.h>???
  7. #include?<errno.h>???
  8. #include?<string.h>???
  9. #include?<netdb.h>???
  10. #include?<sys/types.h>???
  11. #include?<netinet/in.h>???
  12. #include?<sys/socket.h>???
  13. #include?<sys/time.h>??
  14. typedef?int?SOCKET;??
  15. #define?MAXBUFSIZE?1024??
  16. #define?NLISTEN?1024??
  17. #define?isvalidsock(s)??(?(?s?)?>?0?)??
  18. void?set_address(?char?*hname,?char?*sname,struct?sockaddr_in?*sap,?char?*protocol?)??
  19. {??
  20. ????struct?servent?*sp;??
  21. ????struct?hostent?*hp;??
  22. ????char?*endptr;??
  23. ????short?port;??
  24. ??
  25. ????bzero(?sap,?sizeof(?*sap?)?);??
  26. ????sap->sin_family?=?AF_INET;??
  27. ????if?(?hname?!=?NULL?)??
  28. ????{??
  29. ????????if?(?!inet_aton(?hname,?&sap->sin_addr?)?)??
  30. ????????{??
  31. ????????????hp?=?gethostbyname(?hname?);??
  32. ????????????if?(?hp?==?NULL?)??
  33. ????????????????error(?1,?0,?"unknown?host:?%s/n",?hname?);??
  34. ????????????sap->sin_addr?=?*(?struct?in_addr?*?)hp->h_addr;??
  35. ????????}??
  36. ????}??
  37. ????else??
  38. ????????sap->sin_addr.s_addr?=?htonl(?INADDR_ANY?);??
  39. ????port?=?strtol(?sname,?&endptr,?0?);??
  40. ????if?(?*endptr?==?'/0'?)??
  41. ????????sap->sin_port?=?htons(?port?);??
  42. ????else??
  43. ????{??
  44. ????????sp?=?getservbyname(?sname,?protocol?);??
  45. ????????if?(?sp?==?NULL?)??
  46. ????????????error(?1,?0,?"unknown?service:?%s/n",?sname?);??
  47. ????????sap->sin_port?=?sp->s_port;??
  48. ????}??
  49. }??
  50. ??
  51. /*?tcp_client?-?set?up?for?a?TCP?client?*/??
  52. SOCKET?tcp_client(?char?*hname,?char?*sname?)??
  53. {??
  54. ????struct?sockaddr_in?peer;??
  55. ????SOCKET?s;??
  56. ??
  57. ????set_address(?hname,?sname,?&peer,?"tcp"?);??
  58. ????s?=?socket(?AF_INET,?SOCK_STREAM,?0?);??
  59. ????if?(?!isvalidsock(?s?)?)??
  60. ????????error(?1,?errno,?"socket?call?failed"?);??
  61. ??
  62. ????if?(?connect(?s,?(?struct?sockaddr?*?)&peer,??
  63. ?????????sizeof(?peer?)?)?)??
  64. ????????error(?1,?errno,?"connect?failed"?);??
  65. ??
  66. ????return?s;??
  67. }??
  68. ??
  69. ??
  70. int?main(int?argc,char**argv)??
  71. {??
  72. ???SOCKET?s;??
  73. ???s?=?tcp_client(NULL,"5000");??
  74. ???char?buf[100]?=?{""};??
  75. ???recv(s,buf,100,0);??
  76. ???printf("%s/n",buf);??
  77. ???printf("please?input?data(quit?exit):");??
  78. ???while(fgets(buf,100,stdin)?!=?NULL)??
  79. ???{??
  80. ????????if(strcmp(buf,"quit")?==?0)??
  81. ????????????break;??
  82. ????????send(s,buf,strlen(buf),0);??
  83. ????????recv(s,buf,100,0);??
  84. ????????printf("echo?data:%s/n",buf);??
  85. ????????printf("please?input?data(quit?exit):");??
  86. ???}??
  87. ?????
  88. }??

通過: gcc selectcli.c -o selectcli 得到客戶端執行程序.

? 在上面的測試例子中,程序只是簡單演示了如何使用select來輪詢可讀、可寫操作的。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384300.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構(七)圖的遍歷(遞歸非遞歸方法)

圖的遍歷&#xff08;遞歸非遞歸方法&#xff09;#include<iostream> #include<stdio.h> #include<stack> #include<queue> using namespace std;typedef char VertexType; typedef int EdgeType;#define MAXVEX 100 #define INF 65535 bool visited[M…

Linux IO復用區別與epoll詳解

轉載&#xff1a;http://blog.csdn.net/hacker00011000/article/details/52160590 一、select、poll、epoll之間的區別總結[整理]   select&#xff0c;poll&#xff0c;epoll都是IO多路復用的機制。I/O多路復用就通過一種機制&#xff0c;可以監視多個描述符&#xff0c;一…

簡單圖和多重圖

一、簡單圖 ?? ① 不存在重復邊&#xff1b; ?? ② 不存在頂點到自身的邊&#xff1b; 二、多重圖 ??① 某兩結點之間邊數多于一條&#xff1b; ??② 允許頂點通過一條邊和自己關聯&#xff1b;

C++筆記:select多路復用機制

轉載&#xff1a;http://blog.csdn.net/qdx411324962/article/details/42499535 函數作用&#xff1a; 系統提供select函數來實現多路復用輸入/輸出模型。select系統調用是用來讓我們的程序監視多個文件句柄的狀態變化的。程序會停在select這里等待&#xff0c;直到被監視的文件…

交叉編譯執行應用程序出現:No such file or directory

問題分析 當我在arm板子上執行交叉編譯過的程序的時候發現了這個錯誤。通過百度查詢基本都是缺少32位庫什么的,但是都不能解決問題。 然后我用ll指令&#xff0c;也排除了權限的原因。 我們用ldd指令發現&#xff0c;它不是動態執行的&#xff0c;雖然我們可以使用-static指…

select、poll、epoll 比較

轉載&#xff1a;http://blog.csdn.net/dodo_328/article/details/39081183 1.Selet&#xff1a;本質上是通過設置或者檢查存放fd標志位的數據結構來進行下一步處理。 缺點&#xff1a;1 單個進程可監視的fd數量被限制&#xff0c;因為受描述符集合fd_set限制&#xff0c;fd數量…

C庫函數 File

C庫函數常用的有&#xff1a;fopen, fclose, fread, fwrite, fgets, fputs, fscanf, fprintf, fseek, fgetc, fputc, ftell, feof, flush等&#xff0c; 當使用fopen打開一個文件時通常返回一個文件指針 FILE *fp。FILE類型是一個結構體&#xff0c;包含文件描述符&#xff08;…

Unix 網絡編程(四)- 典型TCP客服服務器程序開發實例及基本套接字API介紹

轉載&#xff1a;http://blog.csdn.net/michael_kong_nju/article/details/43457393 寫在開頭&#xff1a; 在上一節中我們學習了一些基礎的用來支持網絡編程的API&#xff0c;包括“套接字的地址結構”、“字節排序函數”等。這些API幾乎是所有的網絡編程中都會使用的一些&…

C庫函數與系統函數的關系

轉載于:https://www.cnblogs.com/lr1402585172/p/10464933.html

Unix網絡編程(六)高級I/O技術之復用技術 select

轉載&#xff1a;http://blog.csdn.net/michael_kong_nju/article/details/44887411 I/O復用技術 本文將討論網絡編程中的高級I/O復用技術&#xff0c;將從下面幾個方面進行展開&#xff1a; a. 什么是復用技術呢&#xff1f; b. 什么情況下需要使用復用技術呢&#xff1f; c. …

open、read、write、文件類型

open&#xff0c;打開一個文件、創建一個文件或判斷一個文件是否存在。 頭文件&#xff1a;<sys/types.h> <sys/stat.h> <fcntl.h> 重載函數有&#xff1a;int open(const char *pathname, int flags) int open(const char *pathname, int flags, mode_t m…

用模板寫單鏈表 尹成

轉載&#xff1a;http://blog.csdn.net/itcastcpp/article/details/39081953 為了加深對模板的理解&#xff0c;我們今天一起用模板寫一個單鏈表&#xff0c;希望通過這個例子&#xff0c;能夠幫助大家加深對模板的體會&#xff0c;具體如下&#xff1a; SList.hpp內容&#xf…

lseek、stat、access、chmod、strtol、truncate、unlink

lseek&#xff0c;可實現計算文件長度&#xff0c;以及文件擴展。 int ret lseek(fd, 0, SEEK_END); //文件長度printf("file lendth %d\n", ret); int ret lseek(fd, 2000, SEEK_END); //文件拓展2000個byte 在文件末尾偏移2000printf("return va…

inode淺談

索引節點inode&#xff1a;保存的其實是實際的數據的一些信息&#xff0c;這些信息稱為“元數據”(也就是對文件屬性的描述)。例如&#xff1a;文件大小&#xff0c;設備標識符&#xff0c;用戶標識符&#xff0c;用戶組標識符&#xff0c;文件模式&#xff0c;擴展屬性&#x…

Openssl-MD5

http://blog.csdn.net/sunspider107/article/details/7395904 MD5是最常用的一個信息摘要算法&#xff0c;雖然現在慢慢被SHA1算法替代&#xff0c;但還是應用廣泛。 MD5的計算結果是16個字節。 int MD5_Init(MD5_CTX *c); 初始化MD5 Context參數&#xff1b; c: MD5 context; …

opendir、readdir以及使用

opendir&#xff0c;打開一個目錄。 函數原型&#xff1a;DIR *opendir(const char *name) DIR *fopendir(int fd) DIR是一個結構指針&#xff0c;是一個內部結構&#xff0c;保存所打開的目錄信息。函數出錯返回NULL readdir&#xff0c;讀目錄 ,<dirent.h> 函數原型&am…

Linux下C語言使用openssl庫進行MD5校驗

http://blog.csdn.net/cassie_huang/article/details/53212933 作者&#xff1a;無腦仔的小明 出處&#xff1a;http://www.cnblogs.com/wunaozai/ 我們以一個字符串為例&#xff0c;新建一個文件filename.txt&#xff0c;在文件內寫入hello &#xff0c;然后在Linux下可以使…

dup、dup2、fcntl

dup、dup2&#xff0c;復制文件描述符 int dup(int oldfd);  //返回文件描述表中沒有被占用的最小可用的描述符&#xff0c;新舊描述符作用相同 int dup2(int oldfd, int newfd);  //如果new已經被打開&#xff0c;先關閉再拷貝就會指向同一個文件&#xff0c;如果old和new…

進程

創建子進程&#xff1a;fork調用&#xff0c; 一次fork調用返回兩個值&#xff0c;1、返回子進程的pid&#xff08;非負整數&#xff09; 2、返回0 父進程的fork返回子進程的id&#xff0c;子進程的fork返回0&#xff08;表示執行成功&#xff09; 創建單個子進程&#xff1a; …

Ubuntu在vmware虛擬機無法上網的解決方法

http://blog.csdn.net/xueyushenzhou/article/details/50460183 在vmware中安裝Ubuntu之后&#xff0c;我們希望基本的功能如上網、傳輸文件等功能都是可用的&#xff0c;但是經常遇到不能上網的情況。使用筆記本時&#xff0c;我們經常希望能通過無線網卡上網&#xff0c;但是…