多路复用的server模型
多路复用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模型的更多相关文章
- 多路复用I/O模型poll() 模型 代码实现
多路复用I/O模型poll() 模型 代码实现 poll()机制和select()机制是相似的,都是对多个描述符进行轮询的方式. 不同的是poll()没有描述符数目的限制. 是通过struct pol ...
- Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型
Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...
- Client/Server 模型 与socket
Client/Server 模型 Sockets 是以 Client 和 Server 交互通信方式来使用的.典型的系统配置是把 Server 放在一台机器中,而把 Client 放在另一台机器中, ...
- Linux C语言 网络编程(二) server模型
前面介绍了关于连接linux服务端方式,可是服务端的资源是有限的,所以我们通常须要又一次思考,设计一套server模型来处理相应的client的请求. 第一种:并发server.通过主进程统一处理cl ...
- 几种server模型
TCP測试用客户程序 每次执行客户程序,在命令行參数指定server的ip地址,port,发起连接的子进程数,和一个待发送的字符串数据,客户程序将模拟多个客户依据指定的子进程数创建子进程来并发的连接到 ...
- TCP并发server模型(三)
本篇博客讲述的是单client单线程模型,该模型相同由主进程统一accept,仅仅是将fork改为了pthread_create. 与进程相比,线程有非常多长处(速度快,占用资源少.数据能够共享). ...
- 多路复用I/O模型epoll() 模型 代码实现
epoll模型 int epoll_create(int maxevent) //创建一个epoll的句柄 然后maxevent表示监听的数目的大小int epoll_ctl(int epollfd, ...
- 多路复用I/O模型select() 模型 代码实现
多路复用I/O: socket编程之select(),poll(),epoll() 代码: client.c #include <stdio.h> #include <sys/ty ...
- TCP/IP之封装,分用,server模型
ios讨论群1群:135718460 1.封装 当应用程序用TCP传送数据时,数据被送入到协议栈中,然后通过每一层直到被当做一串比特流送入网络. 2.分用 当目的主机收到以太网数据帧时,数据就開始从协 ...
随机推荐
- PM【terminal】
More Knowledge More Performance More Time 资料模组化 以知识管理为基础的项目管理 规范:ethic
- Python学习 - 简单抓取页面
最近想做一个小web应用,就是把豆瓣读书和亚马逊等写有书评的网站上关于某本书的打分记录下来,这样自己买书的时候当作参考. 这篇日志这是以豆瓣网为例,只讨论简单的功能. 向服务器发送查询请求 这很好处理 ...
- sql数据库优化技巧汇总
(转)SQL 优化原则 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着 ...
- APCS
arm汇编程序中,R0,R1,R2,R3,R12都是作为中间寄存器,而R4-R11是不能随便使用的,暂时我还不知它们的用途.所以,中间寄存器,在程序运行的开始处与结束的时候值是可以不一样的,也就是说中 ...
- windows“画图”工具用法
图片编辑工具不少,photoshop功能强大,但是并不是那么容易掌握.而且,倘若一个简单的图片处理问题就使用这么强大的工具,有点“杀鸡焉用牛刀”的意思,要知道只打开photoshop就需要一段等待时间 ...
- (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO
http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...
- MATLAB中的结构数组
MATLAB中的结构数组 结构数组: 结构是包含一组记录的数据类型,而记录则是存储在相应的字段中.结构的字段可以是任意一种MATLAB数据类型的变量或者对象.结构类型的变量也可以是一维的.二维的或多维 ...
- PhoneGap + Dreamweaver 5.5 无法在模拟器中打开的问题(二)
转载:http://blog.csdn.net/dupang/article/details/8248335 按照网上的教程搭建Dreamweaver CS5.5+PhoneGap移动开发环境,在进行 ...
- 【Database】MongoDB教程
MongoDB是一个基于分布式文件存储的数据库.旨在为WEB应用提供可扩展的高性能数据存储解决方案.
- windows下NGINX和PHP配合(FASTCGI)
昨天测试了TOMCAT,今天考查了NGINX. 按网上说的作,比较简单. http://www.cnblogs.com/huayangmeng/archive/2011/06/15/2081337.h ...