多路复用的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.分用 当目的主机收到以太网数据帧时,数据就開始从协 ...
随机推荐
- Django国际化注意事项
涉及两部分内容: py/html文件国际化.外部js文件国际化 步骤 1. settings.py 激活相应的配置 2. 针对py文件,需要注意被翻译代码的编写方式 3. 针对html文件,需要注意被 ...
- g++的常用参数
-c 编译成目标文件.o-o 指定输出文件名,输出文件名跟在-o后面,用空格分隔.如果不使用这个选项,缺省的输出文件名为a.out.-g 产生有调试信息的可执行文件-w 不产生警告信息-l 连接指定的 ...
- java中的日期格式
时间日期标识符: yyyy:年 MM:月 dd:日 hh:~12小时制(-) HH:24小时制(-) mm:分 ss:秒 S:毫秒 E:星期几 D:一年中的第几天 F:一月中的第几个星期(会把这个月总 ...
- Dynamics CRM 2011编程系列(60):JS编程之CRUD辅助类(JQuery版)
今天给大家分享一个JQuery版的REST辅助类,在一年前我分享过一个只能在IE环境下运行的REST辅助类:<JS编程之实体CRUD辅助类 >.为什么要推出JQuery版的CRUD辅助类呢 ...
- gcc c语言中scanf输入格式不正确,清空缓冲区问题
我的博客:www.while0.com 折磨了一下午,只因为fflush(stdin)再gcc里和vc里表现不一致.gcc里不能够清空缓冲区.直接上例子: #include <stdio.h&g ...
- git在myelispse中的安装
1.git在myelispse中的安装 http://blog.csdn.net/chinaonlyqiu/article/details/8830050
- Asp.Net MVC向视图View传值的三种常见的方法:
1.通过View( parameter )的参数传递 action: public ActionResult Index() { Person person=new Person("wumi ...
- mkimage使用详解
uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字 ...
- js或者cs代码拼接html
一:使用到的jQuery 文档操作方法 html() 设置或返回匹配的元素集合中的 HTML 内容. append() 向匹配元素集合中的每个元素结尾插入由参数指定的内容. empty() 删除匹配的 ...
- Objective-c知识小结
1.创建一个类产生.h和.m两个文件,.h中对用到的变量.方法作声明,.m文件中实现,导入时只导入.h文件,如果直接把方法写在.m文件中,未在.h文件中进行声明,则是私有方法 2.@interfac ...