多路复用I/O之server模型
 主要是关于select()这个函数:

其原型是:int select(int n,fd_set *read_fds,fd_set *write_fds,fd_set

*except,struct timeval *timeout);

功能是:监测指定集合中指定文件描述符的指定事件是否发生;

参数一:读集合,监测登记文件描述的读事件;

参数二:写集合,监测登记文件描述的写事件

参数三:报错集合,监测登记文件描述的报错事件

void FD_CLR(int fd, fd_set *set);
//从指定集合中把指定文件描述删



int  FD_ISSET(int fd, fd_set *set);
//测试指定集合中的指定文件描述

的事件

void FD_SET(int fd, fd_set *set);
//向指定集合中添加指定文件描述

void FD_ZERO(fd_set *set);
//初始化集合

1 #include <stdio.h>

  2 #include <sys/time.h>

  3 #include <sys/types.h>

  4 #include <unistd.h>

  5 #include <fcntl.h>

  6 #include <sys/types.h>          /* See NOTES */

  7 #include <sys/socket.h>

  8 #include <netinet/in.h>

  9 #include <arpa/inet.h>

 10 

 11 #include <string.h>

 12 

 13 #define PORT    6543

 14 

 15 int main()

 16 {

 17         /*创建套接字,用于连接*/

 18         int s = socket(AF_INET, SOCK_STREAM, 0);

 19         if(0 > s){

 20                 perror("socket");

 21                 return -1;

 22         }

 23 

25 

 26         /*端口重用*/

 27         int reuseaddr = 1;

 28         if(0 > setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reuseaddr,

sizeof(re    useaddr))){

 29                 perror("setsockopt");

 30                 return -1;

 31         }

 32 

 33 

 34 

 35         /*绑定server IP及端口号*/

 36         struct sockaddr_in addr;

 37         memset(&addr, 0, sizeof(struct sockaddr_in));

 38         addr.sin_family = AF_INET;

 39         addr.sin_port = htons(PORT);

 40         addr.sin_addr.s_addr = htonl(INADDR_ANY);

 41 

 42         socklen_t addrlen = sizeof(struct sockaddr_in);

 43         /*struct sockaddr_in addr初始化必须,socklen_t addrlen*/

 44         if(0 > bind(s, (struct sockaddr *)&addr, addrlen)){

 45                 perror("bind");

 46                 return -1;

 47         }

 48 

 49         /*设置监听数*/

 50         listen(s, 10);

 51 

 52         /*设置套接字为非阻塞*/

 53         int val = fcntl(s, F_GETFL, 0);

 54         val |= O_NONBLOCK;

 55         fcntl(s, F_SETFL, val);

 56 

 57         /*初始化读集合*/

 58         fd_set oldset, newset;

 59 /////这里将oldset集合初始化

 60         FD_ZERO(&oldset);

 61 

 62 ////将开始的套接字添加到集合oldset中

 63         FD_SET(s, &oldset);

 64 

 65 

 66 ///这里用maxfd得到最大的套接字数

 67         int maxfd = s+1;

 68 

 69 //////这里设置为select功能实现的时间,超过跳过

 70         struct timeval tm = {

 71                 .tv_sec = 1,

 72                 .tv_usec= 0,

 73         };

 74 

 75         printf("Wait for connecting .\n");

 76         while(1){

 77 

 78 //              printf("-------------1-----------\n");          

 79 ////将oldset这个集合copy给newset(动态包含的套接字的集合)

 80                 newset = oldset;

 81                 //int ret = select(maxfd, &newset, NULL, NULL,

&tm);

 82 

 83 ////////下面将集合newset,用读监听,而且这里没有设置功能运行时间

 84                 int ret = select(maxfd, &newset, NULL, NULL, NULL);

 85                 printf("------------------------\n");

86                 if(0 > ret){

 87                         perror("select");

 88                         return -1;

 89                 }else if(0 == ret){  //////如果超时运行这个条件

 90                         printf("Timeout.\n");

 91                         continue;

 92                 }else{

 93                         /////select成功

 94 //              printf("-------------1-----------\n");          

 95                         /*测试用于连接的套接字,看是否有新连接进来

*/

 96                         if(FD_ISSET(s, &newset)){

 97                                 struct sockaddr_in newaddr;

 98                                 memset(&newaddr, 0, sizeof(struct

sockaddr_i    n));

 99                                 socklen_t newlen = sizeof(struct

sockaddr_in    );

100                                 /*有新连接进来,得到用于读写到套接

字*/

101                                 int news = accept(s, (struct

sockaddr *)&new    addr, &newlen);

102                                 if(0 > news){

103                                         perror("accept");

104                                         return -1;

105                                 }

106                                 /*把套接字保存进集合*/

107                         //      printf("-------------1-----------

\n");              

108 

109                                 FD_SET(news, &oldset);

110                                 if(news+1 > maxfd) {

111                                         maxfd = news+1;

112                                 }

113                 //              maxfd++;

114                                 printf("New connect: SOCKET[%d], %

s:%d\n", n    ews, inet_ntoa(newaddr.sin_addr), ntohs

(newaddr.sin_port));

115                         }

116 

117                         for(int i = s+1; i < maxfd; i++){

118                                 /*测试用于读写到套接字,看哪个客户

端发数据进

    来*/

119                                 if(FD_ISSET(i, &newset)){

120                                 #define MAX 64

121                                         char buf[MAX];

122                                         bzero(buf, MAX);

123                                         int num = recv(i, buf, MAX,

0);

124                                         if(0 >= num){

125                                                 FD_CLR(i, &oldset);

126                                                 close(i);

127                                                 printf("SOCKET[%d]

leave.\n"    , i);

128                                                 continue;

129                                         }

130                                         printf("SOCKET[%d]: %s[%d]

\n", i, bu    f, num);

131                                 } //if

132                         } //for

133                 } //if

134         } //while

135 }

多路复用的server模型的更多相关文章

  1. 多路复用I/O模型poll() 模型 代码实现

    多路复用I/O模型poll() 模型 代码实现 poll()机制和select()机制是相似的,都是对多个描述符进行轮询的方式. 不同的是poll()没有描述符数目的限制. 是通过struct pol ...

  2. Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型

    Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...

  3. Client/Server 模型 与socket

    Client/Server 模型  Sockets 是以 Client 和 Server 交互通信方式来使用的.典型的系统配置是把 Server 放在一台机器中,而把 Client 放在另一台机器中, ...

  4. Linux C语言 网络编程(二) server模型

    前面介绍了关于连接linux服务端方式,可是服务端的资源是有限的,所以我们通常须要又一次思考,设计一套server模型来处理相应的client的请求. 第一种:并发server.通过主进程统一处理cl ...

  5. 几种server模型

    TCP測试用客户程序 每次执行客户程序,在命令行參数指定server的ip地址,port,发起连接的子进程数,和一个待发送的字符串数据,客户程序将模拟多个客户依据指定的子进程数创建子进程来并发的连接到 ...

  6. TCP并发server模型(三)

    本篇博客讲述的是单client单线程模型,该模型相同由主进程统一accept,仅仅是将fork改为了pthread_create. 与进程相比,线程有非常多长处(速度快,占用资源少.数据能够共享). ...

  7. 多路复用I/O模型epoll() 模型 代码实现

    epoll模型 int epoll_create(int maxevent) //创建一个epoll的句柄 然后maxevent表示监听的数目的大小int epoll_ctl(int epollfd, ...

  8. 多路复用I/O模型select() 模型 代码实现

    多路复用I/O:  socket编程之select(),poll(),epoll() 代码: client.c #include <stdio.h> #include <sys/ty ...

  9. TCP/IP之封装,分用,server模型

    ios讨论群1群:135718460 1.封装 当应用程序用TCP传送数据时,数据被送入到协议栈中,然后通过每一层直到被当做一串比特流送入网络. 2.分用 当目的主机收到以太网数据帧时,数据就開始从协 ...

随机推荐

  1. PM【terminal】

    More Knowledge More Performance More Time 资料模组化 以知识管理为基础的项目管理 规范:ethic

  2. Python学习 - 简单抓取页面

    最近想做一个小web应用,就是把豆瓣读书和亚马逊等写有书评的网站上关于某本书的打分记录下来,这样自己买书的时候当作参考. 这篇日志这是以豆瓣网为例,只讨论简单的功能. 向服务器发送查询请求 这很好处理 ...

  3. sql数据库优化技巧汇总

    (转)SQL 优化原则 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着 ...

  4. APCS

    arm汇编程序中,R0,R1,R2,R3,R12都是作为中间寄存器,而R4-R11是不能随便使用的,暂时我还不知它们的用途.所以,中间寄存器,在程序运行的开始处与结束的时候值是可以不一样的,也就是说中 ...

  5. windows“画图”工具用法

    图片编辑工具不少,photoshop功能强大,但是并不是那么容易掌握.而且,倘若一个简单的图片处理问题就使用这么强大的工具,有点“杀鸡焉用牛刀”的意思,要知道只打开photoshop就需要一段等待时间 ...

  6. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  7. MATLAB中的结构数组

    MATLAB中的结构数组 结构数组: 结构是包含一组记录的数据类型,而记录则是存储在相应的字段中.结构的字段可以是任意一种MATLAB数据类型的变量或者对象.结构类型的变量也可以是一维的.二维的或多维 ...

  8. PhoneGap + Dreamweaver 5.5 无法在模拟器中打开的问题(二)

    转载:http://blog.csdn.net/dupang/article/details/8248335 按照网上的教程搭建Dreamweaver CS5.5+PhoneGap移动开发环境,在进行 ...

  9. 【Database】MongoDB教程

    MongoDB是一个基于分布式文件存储的数据库.旨在为WEB应用提供可扩展的高性能数据存储解决方案.

  10. windows下NGINX和PHP配合(FASTCGI)

    昨天测试了TOMCAT,今天考查了NGINX. 按网上说的作,比较简单. http://www.cnblogs.com/huayangmeng/archive/2011/06/15/2081337.h ...