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 ...
随机推荐
- STL容器迭代器失效问题讨论
STL源码剖析---迭代器失效小结 vector迭代器的几种失效的情况: .当插入(push_back)一个元素后,end操作返回的迭代器肯定失效. .当插入(push_back)一个元素后,capa ...
- 一段小程序理解getchar和putchar
#include "stdafx.h" #include <iostream> using namespace std; int main() { char c,d,e ...
- SqlServer——判断对象是否存在
对以下对象判断是否存在:database.table.proc.触发器.临时表.索引.对于这些对象的判断是通过数据表 SysObjects来获得的. 一.基础知识 1.SysObjects系统表 对于 ...
- 问题:C# ToString("P");结果:c#中的常用ToString()方法总结
c#中的常用ToString()方法总结 很多类都重写了ToString方法, 导致很多类的tostring到底执行了什么,有哪些参数,都不清楚 对于int,double等的tostring: C ...
- DAY13-前端之jQuery
jQuery jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行 ...
- 自定义Android Studio方法注释模板
前言 你们从Eclipse转到Android Studio的时候,是不是会怀念Eclipse的方法注释模版? 敲/**加回车,模板就出来了,而Android Studio却不能自定义(或者我没有找到) ...
- js 中的apply
之一------(函数的劫持与对象的复制)关于对象的继承,一般的做法是用复制法: Object.extend 见protpotype.js 的实现方法: Object.extend = functio ...
- [poj3159]Candies(差分约束+链式前向星dijkstra模板)
题意:n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果 解题关键:差分约束系统转化为最短路,B-A>=C,建有向边即可,与 ...
- poj3557 Map Generator
传送门 题目大意 给定两个数n,p;表示n个点中任意两点连边的概率为p,求生成的图是个连通块的概率 分析 我们发现直接求产生联通块的概率并不容易,于是我们转而考虑计算不能生成联通块的概率,公式如下: ...
- C++笔记--名字空间和异常
名字空间 成员函数可以在名字空间的定义里去声明,然后再去采用一种定义方式例如:namespace__name::member_name的方式去定义这个成员函数 namespace parser{ do ...