#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代码框架的更多相关文章

  1. [C++]Linux之多进程运行代码框架

    声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0  多进程代码框架示例 /* @url: ...

  2. linux驱动基础系列--linux spi驱动框架分析

    前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...

  3. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例

    除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #incl ...

  4. linux 通用时钟框架CCF

    linux CCF 时钟框架 简单介绍 这里讲的时钟是给soc各组件提供时钟的树状框架,并非内核使用的时间,和其它模块一样,clk也有框架,用以适配不同的平台.适配层之上是客户代码和接口,也就是各模块 ...

  5. 使用QEMU调试Linux内核代码

    http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...

  6. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例【转】

    转自:https://www.cnblogs.com/welhzh/p/4950341.html 除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnb ...

  7. linux select函数详解

    linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状 ...

  8. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

  9. Linux select 机制深入分析

    Linux select 机制深入分析            作为IO复用的实现方式.select是提高了抽象和batch处理的级别,不是传统方式那样堵塞在真正IO读写的系统调用上.而是堵塞在sele ...

随机推荐

  1. MySQL启动失败解决办法

    本人大二,进了一家培训机构学了两年,然后跟着他们做项目,其实也是练习,然后过程中遇到好多错误,当时解决了,然后下次遇到又忘了,-_-!  -_-||| 我就想通过写博客来记载一下我遇到的错误和解决的办 ...

  2. leetcode398

    public class Solution { int[] nums; Random rnd; public Solution(int[] nums) { this.nums = nums; this ...

  3. python中的变量以及字符串的使用

    在python中只有一个变量:动态变量 在Python当中令人奇怪的是我们的python没有静态变量,这个特性大大的增加了python的灵活性. 由于python中没有静态变量所以我们千万不要使用静态 ...

  4. cocos打包到ios与android上音频推荐

    首先贴一张官方对于ios与android上音频格式的推荐: 这里只给出了推荐格式,一般我们在实际运用中会使用如下方式: 一.IOS与安卓各一套:音乐:都使用MP3    音效:ios用caf Andr ...

  5. Tensorflow手写数字识别训练(梯度下降法)

    # coding: utf-8 import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #p ...

  6. 32-回文字符串(dp)

    http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=37 回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描 ...

  7. opencv3.2 编译安装说明

    Create a temporary directory, which we denote as <cmake_binary_dir>, where you want to put the ...

  8. Python 黑客 --- 001 UNIX口令破解机

    Python 黑客 实战:UNIX口令破解机 使用的系统:Ubuntu 14.04 LTS Python语言版本:Python 2.7.10 V crypt 库是Python内置的库.在UNIX系统使 ...

  9. 算法Sedgewick第四版-第1章基础-011一用链表实现bag、queue、stack

    1. package algorithms.ADT; /************************************************************************ ...

  10. CF1063B Labyrinth

    大家一起膜Rorshach. 一般的$bfs$会造成有一些点访问不到的情况,在$system\ test$的时候会$WA40$(比如我……). 发现这张地图其实是一个边权只有$0/1$的图,我们需要计 ...