多路复用的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.分用 当目的主机收到以太网数据帧时,数据就開始从协 ...
随机推荐
- ZeroBraneStudio之支持GBK文件编码
费了好大劲终于搞定了让ZBS支持打开GBK文件了.记录下过程: 看源码发现ZBS打开文件时会调用src\editor\commands.lua中的LoadFile函数,代码如下: local file ...
- 你的 Docker 应用是安全的吗?
近一年来,Docker 已经逐渐成为 container 界的事实标准,成为技术人员不可或缺的技能之一,就像 Docker 宣称的那样,「Build,Ship,and Run Any App,Anyw ...
- MySQL安装完可以使用,但是找不到对应的系统服务
为何我用 mysqld 启动 mysql 的服务后,在系统“服务”中查不到mysql服务呢?首先声明,我的服务启动成功了,因为我可以另开一个 cmd 窗口进行mysql登录,登录后可以进行各种操作.用 ...
- 2.5.1 使用alertDialog
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...
- C++ 1
1 new 建立一个堆对象 new 类名(初值列表) 返回一个指针 int * p=new int(3)动态分配 2 delete 释放指针 delete p; delete [] p ;释放动态申 ...
- 【HDOJ】2255 奔小康赚大钱
最大二分图匹配,O(n^3). /* 2255 */ #include <iostream> #include <algorithm> #include <cstdio& ...
- Linux学习笔记8——VIM编辑器的使用
在ubuntu中,敲入命令行:sudo apt-get install vim,然后输入系统密码,确认Y,即可下载vim 按下vim,在后面跟上文件的路径,即可进入文件到编辑模式,如果不存在该文件,将 ...
- su认证失败??? su root 输入命令后显示 "su:Authentication failure"
原因:安装的时候没有给root设置密码 解决办法如下:
- JavaScript高级程序设计10.pdf
String类型有几种操作字符串的方法 concat()方法拼接任意多个字符串,不修改原字符串 var stringValue=“hello ”; var result=stringValue.con ...
- 2013=7=12 ACM培训第一天
ACM培训第一天,尽管我嘴上说是来打酱油的,但我非常想学好.1.一定要多思考,多总结:2.多问同学 :3.学会向女生说话,大胆,自信.(今天有女生向我说话了,很高兴.她很大胆,我要向她学习...... ...