转载: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. bzero( sap, sizeof( *sap ) );
  25. sap->sin_family = AF_INET;
  26. if ( hname != NULL )
  27. {
  28. if ( !inet_aton( hname, &sap->sin_addr ) )
  29. {
  30. hp = gethostbyname( hname );
  31. if ( hp == NULL )
  32. error( 1, 0, "unknown host: %s/n", hname );
  33. sap->sin_addr = *( struct in_addr * )hp->h_addr;
  34. }
  35. }
  36. else
  37. sap->sin_addr.s_addr = htonl( INADDR_ANY );
  38. port = strtol( sname, &endptr, 0 );
  39. if ( *endptr == '/0' )
  40. sap->sin_port = htons( port );
  41. else
  42. {
  43. sp = getservbyname( sname, protocol );
  44. if ( sp == NULL )
  45. error( 1, 0, "unknown service: %s/n", sname );
  46. sap->sin_port = sp->s_port;
  47. }
  48. }
  49. SOCKET tcp_server( char *hname, char *sname )
  50. {
  51. struct sockaddr_in local;
  52. SOCKET s;
  53. const int on = 1;
  54. set_address( hname, sname, &local, "tcp" );
  55. s = socket( AF_INET, SOCK_STREAM, 0 );
  56. if ( !isvalidsock( s ) )
  57. error( 1, errno, "socket call failed" );
  58. if ( setsockopt( s, SOL_SOCKET, SO_REUSEADDR,
  59. ( char * )&on, sizeof( on ) ) )
  60. error( 1, errno, "setsockopt failed" );
  61. if ( bind( s, ( struct sockaddr * ) &local,
  62. sizeof( local ) ) )
  63. error( 1, errno, "bind failed" );
  64. if ( listen( s, NLISTEN ) )
  65. error( 1, errno, "listen failed" );
  66. return s;
  67. }
  68. int main(int argc,char**argv)
  69. {
  70. int i,maxi,maxfd,listenfd,connfd,sockfd;
  71. int nready,client[FD_SETSIZE];
  72. fd_set rset,alllset,wset,wsetsave;
  73. char buf[MAXBUFSIZE];
  74. socklen_t clilen;
  75. struct sockaddr_in servaddr,cliaddr;
  76. int rval;
  77. struct timeval to;
  78. int n = 0;
  79. listenfd =  tcp_server(NULL,"5000");
  80. FD_ZERO(&alllset);
  81. FD_ZERO(&wsetsave);
  82. FD_SET(listenfd,&alllset);
  83. maxfd = listenfd;
  84. for(i = 0; i < FD_SETSIZE;i++)
  85. client[i] = -1;
  86. maxi = -1;
  87. while(1)
  88. {
  89. FD_ZERO(&rset);
  90. rset = alllset;
  91. wset = wsetsave;
  92. printf("server waiting...,maxfd:%d/n",maxfd);
  93. nready = select(maxfd+1,&rset,&wset,NULL,NULL);
  94. if(FD_ISSET(listenfd,&rset))
  95. {
  96. clilen = sizeof(cliaddr);
  97. connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);
  98. for(i = 0; i< FD_SETSIZE; i++)
  99. {
  100. if(client[i] < 0)
  101. {
  102. client[i] = connfd;
  103. break;
  104. }
  105. }
  106. if(i == FD_SETSIZE)
  107. {
  108. printf("too many clients /n");
  109. exit(1);
  110. }
  111. FD_SET(connfd,&alllset);
  112. FD_SET(connfd,&wsetsave);
  113. printf("addinng client on fd %d/n",connfd);
  114. if(connfd > maxfd)
  115. maxfd = connfd;
  116. if( i > maxi)
  117. maxi = i;
  118. if(--nready <= 0)
  119. continue;
  120. }
  121. for(i = 0; i <= maxi; i++)
  122. {
  123. if((sockfd = client[i]) < 0 )
  124. continue;
  125. if(FD_ISSET(sockfd,&rset))
  126. {
  127. bzero(buf,100);
  128. if((n = recv(sockfd,buf,MAXBUFSIZE,0)) <= 0)
  129. {
  130. close(sockfd);
  131. FD_CLR(sockfd,&alllset);
  132. client[i] = -1;
  133. printf("recv error,client:%d exit/n",sockfd);
  134. }
  135. else
  136. {
  137. sleep(2);
  138. printf("serving client read on fd %d,recv datalen: %d,data:%s /n",sockfd,n,buf);
  139. write(sockfd,buf,n);
  140. }
  141. if(--nready <= 0 )
  142. break;
  143. }
  144. else if(FD_ISSET(sockfd,&wset))
  145. {
  146. char buf1[100] = {""};
  147. sprintf(buf1,"Welcome the selectsvr .../n");
  148. if((n = send(sockfd,buf1,strlen(buf1),0)) <= 0)
  149. {
  150. close(sockfd);
  151. FD_CLR(sockfd,&wsetsave);
  152. printf("send error,client:%d exit/n",sockfd);
  153. }
  154. else
  155. {
  156. FD_CLR(sockfd,&wsetsave);
  157. printf("serving client write on fd %d,data:%s/n",sockfd,buf1);
  158. }
  159. sleep(5);
  160. }
  161. }
  162. }
  163. }
[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. bzero( sap, sizeof( *sap ) );
  25. sap->sin_family = AF_INET;
  26. if ( hname != NULL )
  27. {
  28. if ( !inet_aton( hname, &sap->sin_addr ) )
  29. {
  30. hp = gethostbyname( hname );
  31. if ( hp == NULL )
  32. error( 1, 0, "unknown host: %s/n", hname );
  33. sap->sin_addr = *( struct in_addr * )hp->h_addr;
  34. }
  35. }
  36. else
  37. sap->sin_addr.s_addr = htonl( INADDR_ANY );
  38. port = strtol( sname, &endptr, 0 );
  39. if ( *endptr == '/0' )
  40. sap->sin_port = htons( port );
  41. else
  42. {
  43. sp = getservbyname( sname, protocol );
  44. if ( sp == NULL )
  45. error( 1, 0, "unknown service: %s/n", sname );
  46. sap->sin_port = sp->s_port;
  47. }
  48. }
  49. /* tcp_client - set up for a TCP client */
  50. SOCKET tcp_client( char *hname, char *sname )
  51. {
  52. struct sockaddr_in peer;
  53. SOCKET s;
  54. set_address( hname, sname, &peer, "tcp" );
  55. s = socket( AF_INET, SOCK_STREAM, 0 );
  56. if ( !isvalidsock( s ) )
  57. error( 1, errno, "socket call failed" );
  58. if ( connect( s, ( struct sockaddr * )&peer,
  59. sizeof( peer ) ) )
  60. error( 1, errno, "connect failed" );
  61. return s;
  62. }
  63. int main(int argc,char**argv)
  64. {
  65. SOCKET s;
  66. s = tcp_client(NULL,"5000");
  67. char buf[100] = {""};
  68. recv(s,buf,100,0);
  69. printf("%s/n",buf);
  70. printf("please input data(quit exit):");
  71. while(fgets(buf,100,stdin) != NULL)
  72. {
  73. if(strcmp(buf,"quit") == 0)
  74. break;
  75. send(s,buf,strlen(buf),0);
  76. recv(s,buf,100,0);
  77. printf("echo data:%s/n",buf);
  78. printf("please input data(quit exit):");
  79. }
  80. }

通过: gcc selectcli.c -o selectcli 得到客户端执行程序.

在上面的测试例子中,程序只是简单演示了如何使用select来轮询可读、可写操作的。

select read write相关推荐

  1. jeee的基础知识(转载)

    Servlet: 1)servlet : servlet是一个特殊的java程序,需要在web服务器上运行,并接收和响应客户端的请求,遵循http协议. 2)Servlet;作用: 主要用于控制层. ...

  2. ORACLE-SQL较全面笔记

    -- 首先,以超级管理员的身份登录oracle        sqlplus sys/bjsxt as sysdba        --然后,解除对scott用户的锁        alter use ...

  3. 设置select下拉框不可修改的→“四”←种方法

    设置select下拉框为不可修改的几种方法: 因为select的特殊性,导致它不能像input表单一样简单地设置一个readonly来限制修改,所以,我们需要进行别的操作! 1.为下拉框添加样式,可以 ...

  4. Go 知识点(09)— for select 作用于 channel

    1. for select 作用于未关闭的通道 1.1 没有 default 分之场景 先看下面代码 func main() {ch := make(chan int, 3)go func() {ti ...

  5. 【Sql Server】DateBase-简单的Select查询

    Select语句查询 小技巧:select 12*13 as 计算结果 Distinct:消除重复列 Where [and/or][多个条件](like '河南%') Where 字句运算符 Betw ...

  6. 根据JSON自动生成select联动

    公用js var CreateSelect = function (obj) {this.__ID__ = 0;this.$dom = $(obj.dom);this.selectList = obj ...

  7. 合肥工业大学—SQL Server数据库实验八:使用聚集函数的SELECT语句

    在数据库EDUC中用SQL语句实现如下查询: 1) 查询学生的总人数 -- 查询学生的总人数 select count(*) from student select count(1) from stu ...

  8. MySQL基础之select基本查询

    DQL语言基本查询 一.基本的select语句 1.查询常量 2.从表中查数据 3.使用列的别名查询 4.去重 5.空值NULL参与运算 6.过滤数据 二. 运算符 1.算术运算符 2.比较运算符 3 ...

  9. select 和 order by

    select 的优先级要高于order by,相当于是select先创建了一个临时表,再通过临时表去排序.所以,对于一些sum()的汇总,在进行排序,实际是排序的select后的字段,而不是表里的那个 ...

  10. js 动态加载select触发事件

    动态加载select后,手动调用一下 subjectChange函数,模拟触发change事件 function hallidChange(value) {$.ajax({type: "po ...

最新文章

  1. 全球每年仅一位!中国数学家印卧涛荣获优化领域Egon Balas奖
  2. linux性能测试命令h,Linux性能测试 pmap命令详解
  3. 化工设备与反应器 第三章 直梁的弯曲
  4. linux 433发送驱动
  5. TestFlight
  6. win7上安装wince6.0
  7. 关于PaddleNLP如何加载训练好的模型进行NER
  8. OpenCV4每日一练day1:VS2015+opencv4.1.0+读图测试
  9. 2018-03-02 certtool的用法
  10. 尚硅谷大数据技术之Hadoop(入门)
  11. 轻松理解Shel脚本中的变量(一)
  12. 如何获取多屏幕显示器工作区域
  13. Html HBuilder封装APP
  14. svchost.exe占用cpu100%
  15. Excel文件双击打开后无内容且不可编辑,再次双击文件正常显示
  16. 线性方程组的矩阵形式
  17. 计算机里面看不到桌面是什么原因,电脑桌面图标都没了是什么情况?电脑桌面图标都没了解决方法...
  18. java 音频倍速播放_Android MediaPlayer 音频倍速播放,调整播放速度
  19. 阿里妈妈广告点击转化率(CTR)预估项目(附github代码)
  20. 【linux下CA证书过期怎么处理】

热门文章

  1. bzoj2375 疯狂的涂色
  2. js 递归函数的使用及常用函数
  3. Oracle锁机制的总结【转】
  4. Request的getParameter和getAttribute方法的差别
  5. Excel 一键上传到数据库
  6. 底量超顶量超级大黑马指标源码_底量超顶量+地量买点_月线底量超顶量大牛股,底量超顶量超级大黑马,底量超顶量买入指标,后量超前量买入指标_指标公式分享交流论坛_理想论坛 - 股票论坛...
  7. 向量外积_解析几何 -向量
  8. python 定义变量_用python解决动态的定义变量名(并给其赋值方法:大数据处理)...
  9. 多源计算机培训,多源数据汇聚的多流形学习算法研究
  10. python socket模块实现udp通信_Python基于socket模块实现UDP通信功能示例