select

  1. select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数
  2. 解决1024以下客户端时使用select是很合适的,但如果链接客户端过多,select采用的是轮询模型,会大大降低服务器响应效率,不应在select上投入更多精
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);nfds:         监控的文件描述符集里最大文件描述符加1,因为此参数会告诉内核检测前多少个文件描述符的状态readfds:    监控有读数据到达文件描述符集合,传入传出参数writefds:    监控写数据到达文件描述符集合,传入传出参数exceptfds:    监控异常发生达文件描述符集合,如带外数据到达异常,传入传出参数timeout:    定时阻塞监控时间,3种情况1.NULL,永远等下去2.设置timeval,等待固定时间3.设置timeval里时间均为0,检查描述字后立即返回,轮询struct timeval {long tv_sec; /* seconds */long tv_usec; /* microseconds */};void FD_CLR(int fd, fd_set *set);     //把文件描述符集合里fd清0int FD_ISSET(int fd, fd_set *set);     //测试文件描述符集合里fd是否置1void FD_SET(int fd, fd_set *set);     //把文件描述符集合里fd位置1void FD_ZERO(fd_set *set);             //把文件描述符集合里所有位清0

server

/* server.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "wrap.h"#define MAXLINE 80
#define SERV_PORT 6666int main(int argc, char *argv[])
{int i, maxi, maxfd, listenfd, connfd, sockfd;int nready, client[FD_SETSIZE];     /* FD_SETSIZE 默认为 1024 */ssize_t n;fd_set rset, allset;char buf[MAXLINE];char str[INET_ADDRSTRLEN];             /* #define INET_ADDRSTRLEN 16 */socklen_t cliaddr_len;struct sockaddr_in cliaddr, servaddr;listenfd = Socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);Bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));Listen(listenfd, 20);         /* 默认最大128 */maxfd = listenfd;             /* 初始化 */
maxi = -1;                    /* client[]的下标 */for (i = 0; i < FD_SETSIZE; i++)client[i] = -1;         /* 用-1初始化client[] */FD_ZERO(&allset);
FD_SET(listenfd, &allset); /* 构造select监控文件描述符集 */for ( ; ; ) {rset = allset;             /* 每次循环时都从新设置select监控信号集 */nready = select(maxfd+1, &rset, NULL, NULL, NULL);if (nready < 0)perr_exit("select error");if (FD_ISSET(listenfd, &rset)) { /* new client connection */cliaddr_len = sizeof(cliaddr);connfd = Accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);printf("received from %s at PORT %d\n",inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),ntohs(cliaddr.sin_port));for (i = 0; i < FD_SETSIZE; i++) {if (client[i] < 0) {client[i] = connfd; /* 保存accept返回的文件描述符到client[]里 */break;}}/* 达到select能监控的文件个数上限 1024 */if (i == FD_SETSIZE) {fputs("too many clients\n", stderr);exit(1);}FD_SET(connfd, &allset);     /* 添加一个新的文件描述符到监控信号集里 */if (connfd > maxfd)maxfd = connfd;         /* select第一个参数需要 */if (i > maxi)maxi = i;                 /* 更新client[]最大下标值 */if (--nready == 0)continue;                 /* 如果没有更多的就绪文件描述符继续回到上面select阻塞监听,负责处理未处理完的就绪文件描述符 */}for (i = 0; i <= maxi; i++) {     /* 检测哪个clients 有数据就绪 */if ( (sockfd = client[i]) < 0)continue;if (FD_ISSET(sockfd, &rset)) {if ( (n = Read(sockfd, buf, MAXLINE)) == 0) {Close(sockfd);        /* 当client关闭链接时,服务器端也关闭对应链接 */FD_CLR(sockfd, &allset); /* 解除select监控此文件描述符 */client[i] = -1;} else {int j;for (j = 0; j < n; j++)buf[j] = toupper(buf[j]);Write(sockfd, buf, n);}if (--nready == 0)break;}}}close(listenfd);return 0;
}

client

/* client.c */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include "wrap.h"#define MAXLINE 80
#define SERV_PORT 6666int main(int argc, char *argv[])
{struct sockaddr_in servaddr;char buf[MAXLINE];int sockfd, n;sockfd = Socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);servaddr.sin_port = htons(SERV_PORT);Connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));while (fgets(buf, MAXLINE, stdin) != NULL) {Write(sockfd, buf, strlen(buf));n = Read(sockfd, buf, MAXLINE);if (n == 0)printf("the other side has been closed.\n");elseWrite(STDOUT_FILENO, buf, n);}Close(sockfd);return 0;
}

包含了”wrap.c”和“wrap.h”文件在上两篇博客中,这里就不重复给出了

转载于:https://www.cnblogs.com/wanghao-boke/p/11409496.html

服务器之select相关推荐

  1. 【Linux网络编程】并发服务器之select模型

    00. 目录 文章目录 00. 目录 01. 概述 02. I/O复用技术概述 03. select模型服务器实现思路 04. select模型服务器实现 05. 附录 01. 概述 服务器设计技术有 ...

  2. redis查看某一个key的大小_redis查看某个key redis中key的操作命令 - Redis - 服务器之家...

    redis查看某个key redis中key的操作命令 发布时间:2017-04-02 来源:服务器之家 在该系列的前几篇博客中,主要讲述的是与Redis数据类型相关的命令,如String.List. ...

  3. java.exe闪退_tomcat7.exe闪退 解决点击startup.bat后闪退的情况 - 电脑常识 - 服务器之家...

    tomcat7.exe闪退 解决点击startup.bat后闪退的情况 发布时间:2017-03-08 来源:服务器之家 最近开始学习jsp编程,当然在开始编程之前,我们要先把开发用的工具准备好,进行 ...

  4. BigData/Cloud Computing:购买并登录Windows弹性云服务器之详细攻略(图文教程)—更优惠、更贴心!

    BigData/Cloud Computing:购买并登录Windows弹性云服务器之详细攻略(图文教程)-更优惠.更贴心! 导读:弹性云服务器(Elastic Cloud Server)是由CPU. ...

  5. 服务器之Windows和Linux

    服务器之Windows和Linux 服务器的概念 服务器,也称伺服器,是提供计算服务的设备.由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力. 服务器的构成包 ...

  6. 空服务器安装linux,debian服务器linux服务器web建站搭建linux服务器之Debian安装

    debian服务器linux服务器web建站搭建linux服务器之Debian安装 原文来自i火吧 大家都知道linux的发行版本很多,有centos啊,debian啊,ubuntu等,下面我就用de ...

  7. linux打开vivado_ubuntu启动vivado UBUNTU 16.04安装VIVADO成功启动SDK - Linux - 服务器之家...

    ubuntu启动vivado UBUNTU 16.04安装VIVADO&&成功启动SDK 发布时间:2017-04-25 来源:服务器之家 在UNBUNTU 16.04 64位 系统下 ...

  8. ASP.NET Web Game 构架设计3--业务逻辑服务器之计时器

      ASP.NET Web Game 构架设计3--业务逻辑服务器之计时器   业务逻辑服务器里主要包括以下四个模块 u          计时服务器 u          资源服务器 u       ...

  9. 阿里云自动java和mysql数据库_阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程)...

    阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程) (仅此纪念人生第一篇学习博客) 前阵子接了一个小小的JavaWe ...

最新文章

  1. mfc在两个控件间连线
  2. 批量正则替换某文件夹中代码(div id=XXXX替换为div id=XXXX)
  3. 浅谈导航电子地图的组成和制作流程
  4. Java入门算法(动态规划篇1:初识动规)
  5. Spring MVC竟然有5种参数绑定的方式?你知道几种?
  6. 搭建ssh框架的步骤
  7. (十九)【AAAI2021】Knowledge-Enhanced Hierarchical Graph Transformer Network for Multi-Behavior Recommend
  8. 虚拟机linux命令界面转,虚拟机-linux系统中图形界面和命令行界面切换
  9. 局部变量 和 全局变量
  10. easyUI跨Tab操作datagrid
  11. uva 11426 GCD - Extreme (II)
  12. java速成课程_极*Java速成教程 - (5)
  13. 探针台常见问题—如何减少LHe制冷剂消耗
  14. 三级计算机信息安全基础知识
  15. 卸载WPS后office图标异常解决办法
  16. 一个数和0xFFFF与运算的意义
  17. 数据科学和人工智能技术笔记 十四、K 最近邻
  18. 终极孵化器:仿生婴儿的美丽新世界
  19. net start mysql启动mysql时报错:发生系统错误 2。找不到指定文件
  20. windows与mac文件夹共享

热门文章

  1. 【VS开发】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)
  2. Linux自动化安装cobbler
  3. 关于数据库表的“记录”与“字段”
  4. Canvas动画 位图缓存提高效率和对应的内存问题
  5. win7下 apache2.2 +php5.4 环境搭建
  6. 文件上传 带进度条(多种风格)
  7. 关于Asp.Net开发中导入外部JavaScript文件的问题
  8. 倒叙输出 php,php foreach正序倒序输出示例代码
  9. java menu字体_Java开发网 - 请问如何让菜单字体变宋体?
  10. js页面加载前执行_做一名合格的前端开发工程师:Javascript加载执行问题探索