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 ...
随机推荐
- 10-30SQLserver基础--(备份和还原、分离和附加数据库)、语句查询操作
一.数据库是一个大容量的存储数据的仓库,为了保证数据完整性,防止一些数据的意外丢失等情况,需要对数据进行备份和还原. 备份数据不影响数据库的正常运行. 1.备份.还原数据库 首先对数据库进行备份,操作 ...
- OSI七层网络模型与TCP/IP四层网络模型
1.OSI网络7层模型 网络协议设计者不应当设计一个单一.巨大的协议来为所有形式的通信规定完整的细节,而应把通信问题划分成多个小问题,然后为每一个小问题设计一个单独的协议.这样做使得每个协议的设计.分 ...
- 201671010127 2016—2017-2 java学习新征程
通过大一整个学年对Python和C语言的学习,我对编程的感受有了更进一步的认识.随着时代的进步,编程语言也在实时更新,面对越来越多的编程语言,对于在编程方面的初学者,选择一门适合自己的编程语言就显得十 ...
- 关于android写入SD卡数据的学习代码
String path = "data/data/com.example.qqlogin/login.txt"; FileOutputStream fos = new FileOu ...
- 3-2 zk客户端连接关闭服务端,查看znode
使用ZooKeeper官方提供的Client来连接.路径类似的结构. 连接到我们的门户HOST. quota属于zookeeper.quota是子节点,zookeeper是父节点.quota其实是一个 ...
- 【总结整理】dojo学习
Dojo Toolkit 的特性可以分到 4 个不同部分.这种划分使得开发人员可以将库大小保持到最小,确保应用程序性能不受大量 JavaScript 库下载的影响.例如,如果您只需要 Ajax 支持性 ...
- Action层, Service层 和 Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO ...
- PCL—关键点检测(rangeImage)低层次点云处理
博客转载自:http://www.cnblogs.com/ironstark/p/5046479.html 关键点又称为感兴趣的点,是低层次视觉通往高层次视觉的捷径,抑或是高层次感知对低层次处理手段的 ...
- c语言学习笔记-变量、变量的命名、变量的赋值和变量的初始化
在学习了简单的输入输出功能和了解了一些基本的运算符号之后我们可以试着做一个非常简单的计算器. 比如说想计算23+65 输入以下代码就可以了. printf("23+65=%d",2 ...
- Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件
一.目标:读取properties文件,获得类名来生成对象 二.类 1.Movable.java public interface Movable { void run(); } 2.Car.java ...