linux select代码框架
- #define PORT 1234
- #define BACKLOG 5
- #define MAXDATASIZE 1000
- typedef struct CLIENT{
- int fd;
- char* name;
- struct sockaddr_in addr;//addr用client_addr更加准确
- char*data;
- };
- void main(){
- int i,maxi,maxfd,sockfd;
- in nready;
- fd_set rset,allset;//allset是我们要监控的fd集合,由于每次调用select都会更改监控的fd集合状态,所以再次调用的时候,需要重新设置fd集合,这里可以用allset保持监控集合,每次调用的时候用rset。改变的只是rset
- ssize_t n;
- int listenfd.connfd;
- struct sockaddr_in server_addr, client_addr;//注意,这里我们把client端的信息保存在CLIENT结构体中,
- CLIENT client[FD_SETSIZE];//FD_SETSIZE是宏常量
- char buf[MAXDATASIZE];
- int sin_size;
- if(listenfd=socket(AF_INET,SOCK_STREAM,)==-){
- perror("create socket failed");
- exit();
- }
- bzero(&server_addr,sizeof(server_addr));
- server_addr.sin_family=AF_INET;
- server_addr.sin_port=htons(PORT);
- server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
- if(bind(listenfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr)==-)
- { perror("bind socket failed");
- exit();
- }
- if(listen(listenfd,BACKLOG)==-)
- { perror("listen socket failed");
- exit();
- }
- sin_size=sizeof(struct sockaddr_in)
- maxfd=listenfd;//最大的文件描述符
- maxi=-; //最大的用过的CLIENT数组下标
- for(i=;i<FD_SETSIZE;i++){
- client[i].fd=-;
- }//初始化client数组
- FD_ZERO(&allset);
- FD_SET(listenfd,&allset);//加入监听
- while(){
- struct sockaddr_in addr; //用于返回client端的信息
- rset=allset;// 再次重新赋值
- nready=select(maxfd+,&rset,NULL,NULL,NULL)//这测试FD读就绪,写的fdset为NULL
- if(FD_ISSET(listenfd,&allset)){ //new client connection
- if((connfd=accept(listenfd,(struct sockaddr*)&addr,&sin_size))==-)
- { perror("accept() error\n");
- exit();
- continue;
- }
- for(i=;i<FD_SETSIZE;i++)
- if(client[i].fd<){
- client[i].fd=connfd;
- client[i].name=new char[MAXDATASIZE];
- client[i].addr=addr;//客服端的socket地址信息
- printf(" you got a connection from client");
- break;
- }
- if(i==FD_SETSIZE) printf("too many connection")//;连接数的FD已经超过最大的1024
- FD_SET(connfd,&allset);//把connfd加入监听集合中
- if(connfd>maxfd) maxfd=connfd;//更新目前最大的FD;
- if(i>maxi) maxi=i;
- if(--nready<=) continue;//之前select返回的时候只有一个监听listen是就绪的,则继续循环while(1),下面的程序不执行
- } //对应 if(FD_ISSET(listenfd,&allset))
- for(i=;i<=maxfd;i++){
- if((sockfd=client[i].fd<)) continue;
- if(FD_ISSET(sockfd,&rset)){//分两种情况,一种是此FD由于关闭连接,而变成可读
- if( (n=recv(sockfd,recvbuf,MAXDATASIZE,))==){
- close(sockfd);//关闭这个连接对应服务器的连接socket
- FD_CLR(sockfd,&allset);//从监控的FD集合中删除
- ..................
- ...................
- }
- else
- process(&client[i],revbuf,n)//否则就是读就绪,进行我们的操作
- if(--nready<=) break;//处理完了所有的就绪描述符
- }
- }
- }
- close(listenfd);//调出while
- }
linux select代码框架的更多相关文章
- [C++]Linux之多进程运行代码框架
声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0 多进程代码框架示例 /* @url: ...
- linux驱动基础系列--linux spi驱动框架分析
前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...
- linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例
除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #incl ...
- linux 通用时钟框架CCF
linux CCF 时钟框架 简单介绍 这里讲的时钟是给soc各组件提供时钟的树状框架,并非内核使用的时间,和其它模块一样,clk也有框架,用以适配不同的平台.适配层之上是客户代码和接口,也就是各模块 ...
- 使用QEMU调试Linux内核代码
http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...
- linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例【转】
转自:https://www.cnblogs.com/welhzh/p/4950341.html 除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnb ...
- linux select函数详解
linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状 ...
- Linux USB驱动框架分析 【转】
转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...
- Linux select 机制深入分析
Linux select 机制深入分析 作为IO复用的实现方式.select是提高了抽象和batch处理的级别,不是传统方式那样堵塞在真正IO读写的系统调用上.而是堵塞在sele ...
随机推荐
- linux 权限 homework
作业一: 1) 新建用户natasha,uid为1000,gid为555,备注信息为“master” useradd natasha -u 1000 -g 555 -c "master&qu ...
- 跨resetlogs不完全恢复- oracle自动reset错误incarnation
在做oracle跨resetlogs的不完全恢复时,如果未删除flashback area的控制文件自动备份,那么Oracle可能会从控制文件自动备份中自动探测到incarnation信息,并重置in ...
- oracle connect by用法篇 (包括树遍历)之二
3.2查询当前时间往前的12周的开始时间.结束时间.第多少周 , ) - (rownum ) as startDate, sysdate , 'd'))) - (rownum ) as endDate ...
- Tiny4412 Uboot
1. Build uboot a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好 环境变量PATH,保证可以正常使用. b) 解 ...
- python爬虫框架(3)--Scrapy框架安装配置
1.安装python并将scripts配置进环境变量中 2.安装pywin32 在windows下,必须安装pywin32,安装地址:http://sourceforge.net/projects/p ...
- day35-hibernate映射 05-Hibernate的一级缓存:快照区
SessionImpl里面有很多的Java集合,很多java集合才构成了一级缓存.一级缓存里面有一个非常特殊的区域叫做快照区.SessionImpl实现了Session接口,有很多Java集合(包括M ...
- 主键primary key和唯一索引unique index
1)主键一定是唯一性索引,唯一性索引并不一定就是主键. 2)主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引. 3)主键常常与外键构成参照完整性约束,防止出现数 ...
- 项目一:第九天 1、前台客户登录 2、Jquery citypicker省市区三级联动插件 4、业务受理(在线下单)
1. 前台客户登录 2. Jquery citypicker省市区三级联动插件 3. 百度地图介绍 4. 业务受理(在线下单) 1 实现前台系统登录功能 1.1 Md5加密 admin(明文)---- ...
- 数字图像处理实验(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 ...
- easyUI datagrid 分页参数page和rows
Struts2获取easyUI datagrid 分页参数page和rows 用pageHelper分页时,只要是能够获取前台传来的两个参数page和rows基本就完成了很大一部分. 获取方法:定义两 ...