1. #define PORT 1234
  2. #define BACKLOG 5
  3. #define MAXDATASIZE 1000
  4. typedef struct CLIENT{
  5. int fd;
  6. char* name;
  7. struct sockaddr_in addr;//addr用client_addr更加准确
  8. char*data;
  9. };
  10. void main(){
  11. int i,maxi,maxfd,sockfd;
  12. in nready;
  13. fd_set rset,allset;//allset是我们要监控的fd集合,由于每次调用select都会更改监控的fd集合状态,所以再次调用的时候,需要重新设置fd集合,这里可以用allset保持监控集合,每次调用的时候用rset。改变的只是rset
  14. ssize_t n;
  15. int listenfd.connfd;
  16. struct sockaddr_in server_addr, client_addr;//注意,这里我们把client端的信息保存在CLIENT结构体中,
  17. CLIENT client[FD_SETSIZE];//FD_SETSIZE是宏常量
  18. char buf[MAXDATASIZE];
  19. int sin_size;
  20. if(listenfd=socket(AF_INET,SOCK_STREAM,)==-){
  21. perror("create socket failed");
  22. exit();
  23. }
  24. bzero(&server_addr,sizeof(server_addr));
  25. server_addr.sin_family=AF_INET;
  26. server_addr.sin_port=htons(PORT);
  27. server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
  28. if(bind(listenfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr)==-)
  29. { perror("bind socket failed");
  30. exit();
  31. }
  32. if(listen(listenfd,BACKLOG)==-)
  33. { perror("listen socket failed");
  34. exit();
  35. }
  36. sin_size=sizeof(struct sockaddr_in)
  37.  
  38. maxfd=listenfd;//最大的文件描述符
  39. maxi=-; //最大的用过的CLIENT数组下标
  40. for(i=;i<FD_SETSIZE;i++){
  41. client[i].fd=-;
  42. }//初始化client数组
  43. FD_ZERO(&allset);
  44. FD_SET(listenfd,&allset);//加入监听
  45.  
  46. while(){
  47. struct sockaddr_in addr; //用于返回client端的信息
  48. rset=allset;// 再次重新赋值
  49. nready=select(maxfd+,&rset,NULL,NULL,NULL)//这测试FD读就绪,写的fdset为NULL
  50.  
  51. if(FD_ISSET(listenfd,&allset)){ //new client connection
  52. if((connfd=accept(listenfd,(struct sockaddr*)&addr,&sin_size))==-)
  53. { perror("accept() error\n");
  54. exit();
  55. continue;
  56. }
  57. for(i=;i<FD_SETSIZE;i++)
  58. if(client[i].fd<){
  59. client[i].fd=connfd;
  60. client[i].name=new char[MAXDATASIZE];
  61. client[i].addr=addr;//客服端的socket地址信息
  62. printf(" you got a connection from client");
  63. break;
  64. }
  65.  
  66. if(i==FD_SETSIZE) printf("too many connection")//;连接数的FD已经超过最大的1024
  67. FD_SETconnfd,&allset);//把connfd加入监听集合中
  68. if(connfd>maxfd) maxfd=connfd;//更新目前最大的FD;
  69. if(i>maxi) maxi=i;
  70. if(--nready<=) continue;//之前select返回的时候只有一个监听listen是就绪的,则继续循环while(1),下面的程序不执行
  71. } //对应 if(FD_ISSET(listenfd,&allset))
  72. for(i=;i<=maxfd;i++){
  73. if((sockfd=client[i].fd<)) continue;
  74. if(FD_ISSET(sockfd,&rset)){//分两种情况,一种是此FD由于关闭连接,而变成可读
  75. if( (n=recv(sockfd,recvbuf,MAXDATASIZE,))==){
  76. close(sockfd);//关闭这个连接对应服务器的连接socket
  77. FD_CLR(sockfd,&allset);//从监控的FD集合中删除
  78. ..................
  79. ...................
  80. }
  81. else
  82. process(&client[i],revbuf,n)//否则就是读就绪,进行我们的操作
  83. if(--nready<=) break;//处理完了所有的就绪描述符
  84. }
  85. }
  86. }
  87. close(listenfd);//调出while
  88. }

linux select代码框架的更多相关文章

  1. [C++]Linux之多进程运行代码框架

    声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0  多进程代码框架示例 /* @url: ...

  2. linux驱动基础系列--linux spi驱动框架分析

    前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...

  3. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例

    除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #incl ...

  4. linux 通用时钟框架CCF

    linux CCF 时钟框架 简单介绍 这里讲的时钟是给soc各组件提供时钟的树状框架,并非内核使用的时间,和其它模块一样,clk也有框架,用以适配不同的平台.适配层之上是客户代码和接口,也就是各模块 ...

  5. 使用QEMU调试Linux内核代码

    http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...

  6. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例【转】

    转自:https://www.cnblogs.com/welhzh/p/4950341.html 除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnb ...

  7. linux select函数详解

    linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状 ...

  8. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

  9. Linux select 机制深入分析

    Linux select 机制深入分析            作为IO复用的实现方式.select是提高了抽象和batch处理的级别,不是传统方式那样堵塞在真正IO读写的系统调用上.而是堵塞在sele ...

随机推荐

  1. linux 权限 homework

    作业一: 1) 新建用户natasha,uid为1000,gid为555,备注信息为“master” useradd natasha -u 1000 -g 555 -c "master&qu ...

  2. 跨resetlogs不完全恢复- oracle自动reset错误incarnation

    在做oracle跨resetlogs的不完全恢复时,如果未删除flashback area的控制文件自动备份,那么Oracle可能会从控制文件自动备份中自动探测到incarnation信息,并重置in ...

  3. oracle connect by用法篇 (包括树遍历)之二

    3.2查询当前时间往前的12周的开始时间.结束时间.第多少周 , ) - (rownum ) as startDate, sysdate , 'd'))) - (rownum ) as endDate ...

  4. Tiny4412 Uboot

    1. Build uboot a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好 环境变量PATH,保证可以正常使用. b) 解 ...

  5. python爬虫框架(3)--Scrapy框架安装配置

    1.安装python并将scripts配置进环境变量中 2.安装pywin32 在windows下,必须安装pywin32,安装地址:http://sourceforge.net/projects/p ...

  6. day35-hibernate映射 05-Hibernate的一级缓存:快照区

    SessionImpl里面有很多的Java集合,很多java集合才构成了一级缓存.一级缓存里面有一个非常特殊的区域叫做快照区.SessionImpl实现了Session接口,有很多Java集合(包括M ...

  7. 主键primary key和唯一索引unique index

    1)主键一定是唯一性索引,唯一性索引并不一定就是主键. 2)主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引. 3)主键常常与外键构成参照完整性约束,防止出现数 ...

  8. 项目一:第九天 1、前台客户登录 2、Jquery citypicker省市区三级联动插件 4、业务受理(在线下单)

    1. 前台客户登录 2. Jquery citypicker省市区三级联动插件 3. 百度地图介绍 4. 业务受理(在线下单) 1 实现前台系统登录功能 1.1 Md5加密 admin(明文)---- ...

  9. 数字图像处理实验(2):PROJECT 02-02, Reducing the Number of Gray Levels in an Image 标签: 图像处理MATLAB 2017-

    实验要求: Reducing the Number of Gray Levels in an Image Objective To understand how the number of gray ...

  10. easyUI datagrid 分页参数page和rows

    Struts2获取easyUI datagrid 分页参数page和rows 用pageHelper分页时,只要是能够获取前台传来的两个参数page和rows基本就完成了很大一部分. 获取方法:定义两 ...