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 ...
随机推荐
- Ueditor/自定义配置
UEditor除 了具有轻量.可定制等优点外,还始终将优化编辑操作.提升用户体验摆在了很重要的位置.在这一点上,除了对编辑器功能.性能.实现细节等不断地改进和追求 创新之外,众多灵活而人性化的自定义配 ...
- 实验吧CTF题库-密码学(部分)
这里没有key: 打开链接,有一个弹窗 然后就是一个空白网页,右键查看源代码 这里有一串js密文,解密一下,https://www.dheart.net/decode/index.php 得到flag ...
- Spring-@value用法详解
为了简化读取properties文件中的配置值,spring支持@value注解的方式来获取,这种方式大大简化了项目配置,提高业务中的灵活性. 一.两种使用方法 1.@Value("#{co ...
- 部署和调优 3.2 dns安装配置-2
配置一个自定义的域,随便定义的,不实际存在. 在配置文件里,增加一个域 vim /etc/named.conf zone "123.com" IN { type master; f ...
- LAMP 2.9 php扩展模块如何安装
php 和 apache 类似,核心文件为/usr/local/php/bin/php,针对 apache 的是/usr/local/apache2/modules/libphp5.so 模块.这两个 ...
- cocos2dx中坐标系
CCNode类的setPosition,getPosition函数如果是一个Node的Child则获取的坐标就是该Node的本地坐标 另一个关键问题就是在cocos2d-x里就是各种对象的大小问题.因 ...
- Python01 python入门介绍
1 python简介 1.1 为什么学python python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van ...
- NCBI下载SRA数据
从NCBI下载数据本来是一件很简单的事情,但是今天碰到几个坑: 1.paper里没有提供SRA数据号.也没有提供路径: 2.不知道文件在ftp的地址,不能直接用wget下载 所以通过在NCBI官网,直 ...
- linux环境安装python
linux环境下安装python3,一步一步来吧! 安装python3 安装readline-devel依赖 ,用于解决python3安装完成后,退格和方向键乱码问题 yum install read ...
- Hibernate 处理查询 in 字句
from : http://blog.csdn.net/wodestudy/article/details/38200421 在处理hibernate的实体查询,一般可以采用多种方式处理复杂的查询,比 ...