直接看调用主函数中while循环的部分

每次调用select都会改变FD_SET的值, 所以要两个变量,allset,以及一个rset

先看看是否有客户端请求连接,如果有处理连接。

这里用新开一个数组维护文件描述符。这样的好处是如果用动态数组,可以动态维护文件描述符。

遍历整个客户端的数组,然后来看看有没有可以读的信息

select函数的缺点是每次要将FD_SET拷贝到内核区,是基于轮询机制的IO多路复用。

while (1) {   rset = allset;                                          /* 每次循环时都从新设置select监控信号集 */nready = select(maxfd+1, &rset, NULL, NULL, NULL);if (nready < 0)perr_exit("select error");if (FD_ISSET(listenfd, &rset)) {                        /* 说明有新的客户端链接请求 */clie_addr_len = sizeof(clie_addr);connfd = Accept(listenfd, (struct sockaddr *)&clie_addr, &clie_addr_len);       /* Accept 不会阻塞 */printf("received from %s at PORT %d\n",inet_ntop(AF_INET, &clie_addr.sin_addr, str, sizeof(str)),ntohs(clie_addr.sin_port));for (i = 0; i < FD_SETSIZE; i++)if (client[i] < 0) {                            /* 找client[]中没有使用的位置 */client[i] = connfd;                         /* 保存accept返回的文件描述符到client[]里 */break;}if (i == FD_SETSIZE) {                              /* 达到select能监控的文件个数上限 1024 */fputs("too many clients\n", stderr);exit(1);}FD_SET(connfd, &allset);                            /* 向监控文件描述符集合allset添加新的文件描述符connfd */if (connfd > maxfd)maxfd = connfd;                                 /* select第一个参数需要 */if (i > maxi)maxi = i;                                       /* 保证maxi存的总是client[]最后一个元素下标 */if (--nready == 0)continue;} for (i = 0; i <= maxi; i++) {                               /* 检测哪个clients 有数据就绪 */if ((sockfd = client[i]) < 0)continue;if (FD_ISSET(sockfd, &rset)) {if ((n = Read(sockfd, buf, sizeof(buf))) == 0) {    /* 当client关闭链接时,服务器端也关闭对应链接 */Close(sockfd);FD_CLR(sockfd, &allset);                        /* 解除select对此文件描述符的监控 */client[i] = -1;} else if (n > 0) {for (j = 0; j < n; j++)buf[j] = toupper(buf[j]);Write(sockfd, buf, n);Write(STDOUT_FILENO, buf, n);}if (--nready == 0)break;                                          /* 跳出for, 但还在while中 */}}}

linux c select 服务器源码 简介相关推荐

  1. Linux进阶-FTP服务器源码搭建(pureftpd)

    本文介绍的是centos7版本的Linux系统基础知识 作者:lxy FTP介绍 在互联网上提供文件存储和访问服务的计算机,FTP可以用来在两台计算机之间传输文件 安装FTP(源码安装pureftpd ...

  2. linux samba代码,Linux下Samba服务器源码安装及配置

    获取samba源代码 你可以通过执行svn命令svn co svn://svnanon.samba.org/samba/trunk samba.获取最新的samba源文件,也可以直接从http://s ...

  3. linux内核体系学习路径_Linux内核分析(一)linux体系简介|内核源码简介|内核配置编译安装...

    从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底,同时在博文中如果那些地方有问题还请各位大神为我讲解. 今天我们会分析到以下内容: 1. Linux体系结构简介 ...

  4. 采集网站服务器配置,搭建数据采集云服务器源码

    搭建数据采集云服务器源码 内容精选 换一换 云速建站暂不支持自主搭建代码,您可以考虑通过添加高级代码插件实现相关功能.云速建站是一套基于SaaS模式的建站系统,使用的是云服务平台,不止是一台服务器,一 ...

  5. 通用查询实现方案(可用于DDD)[附源码] -- 简介

    通用查询实现方案(可用于DDD)[附源码] -- 简介 原文:通用查询实现方案(可用于DDD)[附源码] -- 简介 [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/ ...

  6. (原创)通用查询实现方案(可用于DDD)[附源码] -- 简介

    [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3985353.html). [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- 简介 ...

  7. SRS(simple-rtmp-server)流媒体服务器源码分析--启动

    SRS(simple-rtmp-server)流媒体服务器源码分析--系统启动 一.前言 小卒最近看SRS源码,随手写下博客,其一为了整理思路,其二也是为日后翻看方便.如果不足之处,请指教! 首先总结 ...

  8. 从Linux角度以及JVM源码,深入NIO的细节

    原文地址:[网络编程]从Linux角度以及JVM源码,深入NIO的细节 最近一段时间都在啃Linux内核, 也给了自己机会再度深入理解Java的NIO实现,希望能获得更多东西,尝试理解以前未能理解的, ...

  9. Linux驱动开发 / fbtft源码速读

    哈喽,老吴又来分享学习心得啦~ 一.目标与体系 目标是关于你想要达到的结果,而体系是涉及导致这些结果的过程; 目标的意义在于确定大方向,但体系才能促进进步.完全忽略目标,只关注体系,仍然会成功. 结果 ...

最新文章

  1. 物联网面临的7大网络安全威胁
  2. rocketmq单机搭建
  3. Apache ZooKeeper - 事件监听机制详解
  4. 多线程的两种实现方式和区别?
  5. 数据库开发——MySQL——内置功能
  6. oracle存储过程实现根据已有数据批量更新另一批数据
  7. java socket编程(转)
  8. mysql的分片系统_MySQL分片
  9. 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器
  10. 微型通用程序框架-规划
  11. 拳王公社:网赚高手的零成本引流秘籍,这4个才是核心思维!
  12. 2019.7.19刷题统计
  13. 「沐神」工作五年的沉思录 「这就是李沐」开挂人生的深度解读
  14. cron表达式每隔1小时一次_quartz 每天 8-10点每隔10分钟执行一次,11-13点每隔1小时执行一次 cronExpression 要怎么写?...
  15. 工作缺点和不足及措施_个人工作缺点和不足
  16. 成语秀才小程序部署问题总结
  17. GIS空间分析之Buffer
  18. 9月最新版 H5移动棋牌游戏联运推广平台移动游戏系统源代码下载(带安装说明)
  19. 学计算机有哪些推荐书籍?
  20. 买菜App综合服务水平排行:盒马、多点、每日优鲜排前三

热门文章

  1. [zz]Apache Thrift学习小记
  2. 教你怎样快速DIY自己的博客园SKIN
  3. 3em html5,谁是最好的手机浏览器:IE9 VS Safari 5
  4. python plot设置坐标轴_python matplotlib坐标轴设置的方法
  5. 5GS 协议栈 — N2 接口的协议栈(NGAP/N2-SM)
  6. Python 基础语法_Python脚本文件结构
  7. python使用笔记:pyperclip模块安装和使用
  8. 示波器探头使用注意事项,示波器探头的选择
  9. 比特币的锁定脚本与解锁脚本
  10. 微信小程序教学第三章第四节(含视频):小程序中级实战教程:下拉更新、分享、阅读标识...