多路复用的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.分用 当目的主机收到以太网数据帧时,数据就開始从协 ...
随机推荐
- opencv 构造训练器
D:/face 构造face训练器为例 一:样本创建 训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本,反例样本指其它任意图片. 负样本可以来自于任意的图片,但这些图片不能包含目标特征 ...
- JS获取终端屏幕、浏览窗口的相关信息
查看终端屏幕相关信息,在windows系统的控制面板可以查到分辨率且可以设置,更具体的浏览器可视窗口等信息则需要借助其他工具.而在程序里需要动态获取时该怎么做呢? 琢磨的一个js方法,供大家参考.如下 ...
- PyCharm如何设置显示行号?
File->setting->Editor->General->Appearance,勾选Show line numbers
- [HDOJ - 5208] Where is Bob 【DFS+按位贪心】
题目链接:HDOJ - 5208 题目分析 使用按位贪心的思想,即从高位向低位枚举,尽量使这一位的答案为 1 . 我们使用 DFS ,每次就是对于 [l1, r1] [l2, r2] x 进行处理 ...
- 对话机器学习大神Yoshua Bengio(下)
对话机器学习大神Yoshua Bengio(下) Yoshua Bengio教授(个人主页)是机器学习大神之一,尤其是在深度学习这个领域.他连同Geoff Hinton老先生以及 Yann LeCun ...
- Life Forms
poj3294:http://poj.org/problem?id=3294 题意:就是求n个串的中一个最大的子串,这个子串在超过n/2的串中出现. 题解:这是一道好题.首先一种解法就是用后缀数组来搞 ...
- 在linux中使用php将word文档转为pdf
使用本教程需要在linux中安装openoffice,改页面中有详细的安装与使用教程(http://www.cnblogs.com/sustudy/p/3999628.html). 既然,你看了该教程 ...
- Java_xml_Dom解析方式
本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/12094775 1.Node准备 Node接口是整个文档对象模型的主要 ...
- [LeetCode#84]Largest Rectangle in Histogram
Problem: Given n non-negative integers representing the histogram's bar height where the width of ea ...
- 【EJS】
// 用=号输出,就会被escapge转义编码 <%= VARIABLE_NAME %> // 用“-”输出原始内容, 不会被escape <%- VARIABLE_NAME %&g ...