多路复用的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.分用 当目的主机收到以太网数据帧时,数据就開始从协 ...
随机推荐
- Memcache,Redis
Memcache Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度. ...
- Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作
一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...
- iOS: 布局可视化语法 Visual Format Syntax
可视化语法 Visual Format Syntax The following are examples of constraints you can specify using the visua ...
- linux建立信任关系
(1).切换到需要建立信任关系的用户(2).执行命令:ssh-keygen -d,然后一直回车.该命令会在用户home目录下生成一个隐藏的.ssh目录.目录里面有两个文件:id_dsa.id_dsa ...
- 了解SOA是什么!
面向服务架构 面向服务的体系结构(service-oriented architecture,SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来 ...
- sourceInsight的技巧
在用sourceInsight看代码...在这里积累技巧,慢慢积累吧 1.如何高亮显示所有要搜的东西,例如 1.aaaaaa 2. bbbbbbbbaaaaaaa 3. ccccccc 4. aaaa ...
- Uva_10253 Series-Parallel Networks
题目链接 题目大意: 1:一条单独的边是串并联网络 2:G1,G2为串并联网络, 将它们的源点与汇点分别连接起来, 得到的也是串并联网络(并联) 3:G1,G2为串并联网络, 将G1的汇点与G2的源点 ...
- Android 小闹钟程序
最近写了个闹钟的程序,看到SharedPreferences在一个程序中可以共享数据,SharedPreferences是一个轻量级的键值存储机制,只可以存储基本数据类型.我就拿来用用,没想到Shar ...
- C++11并发内存模型学习
C++11标准已发布多年,编译器支持也逐渐完善,例如ms平台上从vc2008 tr1到vc2013.新标准对C++改进体现在三方面:1.语言特性(auto,右值,lambda,foreach):2.标 ...
- Java基础之String,StringBuilder,StringBuffer
在创建字符串的时候总是习惯性的使用String str = "...";,str = str+"abcd";也有听说过StringBuffer,StringBu ...