多路复用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模型的更多相关文章

  1. 多路复用I/O模型poll() 模型 代码实现

    多路复用I/O模型poll() 模型 代码实现 poll()机制和select()机制是相似的,都是对多个描述符进行轮询的方式. 不同的是poll()没有描述符数目的限制. 是通过struct pol ...

  2. Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型

    Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...

  3. Client/Server 模型 与socket

    Client/Server 模型  Sockets 是以 Client 和 Server 交互通信方式来使用的.典型的系统配置是把 Server 放在一台机器中,而把 Client 放在另一台机器中, ...

  4. Linux C语言 网络编程(二) server模型

    前面介绍了关于连接linux服务端方式,可是服务端的资源是有限的,所以我们通常须要又一次思考,设计一套server模型来处理相应的client的请求. 第一种:并发server.通过主进程统一处理cl ...

  5. 几种server模型

    TCP測试用客户程序 每次执行客户程序,在命令行參数指定server的ip地址,port,发起连接的子进程数,和一个待发送的字符串数据,客户程序将模拟多个客户依据指定的子进程数创建子进程来并发的连接到 ...

  6. TCP并发server模型(三)

    本篇博客讲述的是单client单线程模型,该模型相同由主进程统一accept,仅仅是将fork改为了pthread_create. 与进程相比,线程有非常多长处(速度快,占用资源少.数据能够共享). ...

  7. 多路复用I/O模型epoll() 模型 代码实现

    epoll模型 int epoll_create(int maxevent) //创建一个epoll的句柄 然后maxevent表示监听的数目的大小int epoll_ctl(int epollfd, ...

  8. 多路复用I/O模型select() 模型 代码实现

    多路复用I/O:  socket编程之select(),poll(),epoll() 代码: client.c #include <stdio.h> #include <sys/ty ...

  9. TCP/IP之封装,分用,server模型

    ios讨论群1群:135718460 1.封装 当应用程序用TCP传送数据时,数据被送入到协议栈中,然后通过每一层直到被当做一串比特流送入网络. 2.分用 当目的主机收到以太网数据帧时,数据就開始从协 ...

随机推荐

  1. Day18 Django之路由系统、模板语言、Ajax、Model

    一.路由系统 1.创建Django项目 django-admin startproject day18 cd day18 python3 manage.py startapp app01 2.app0 ...

  2. java printf与println的区别

    Java中的println和printf的区别在于:println是用于输出参数内容,然后换行,其参数个数固定为一个.printf是用于输出带各种数据类型的占位符的参数,其参数个数是不定的.

  3. SpringMVC源码阅读(二)

    今天分析下ViewResolver和View的实现  下面是ModelAndView的实现 package org.springframework.web.servlet; import java.u ...

  4. 2015_WEB页面前端工程师_远程测题_东方蜘蛛_1

    请使用HTML+CSS实现如下效果: 1. 使用CSS Sprites,实现如图1效果,素材图片为: icons.png: 2. 使用脚本语言验证邮箱.密码的必填以及邮箱的合法性: 若验证失败,则出现 ...

  5. Linux内核监控模块-2-系统调用表地址的获取(Linux内核版本3.13)

    那么在Linux内核2.6之后,不能直接导出sys_call_table的地址后,我们要如何获得系统调用表的地址,从而实现系统调用的截获呢. 先贴上我实现好的代码,然后再来讲解吧. modu.c #i ...

  6. nutch 大量网站

    下载地址:http://rdf.dmoz.org/rdf/content.rdf.u8.gzDMOZ网站是一个著名的开放式分类目录(Open DirectoryProject),之所以称为开放式分类目 ...

  7. YARN应用程序开发流程(类似于MapReduce On Yarn)本内容版权归(小象学院所有)

    MapReduce On Yarn和MapReduce程序区别 MapReduce On Yarn(由专业人员开发)1 为MapReduce作业运行在YARN上提供一个通用的运行时环境2 需要与Yar ...

  8. Hadoop 学习笔记 (十一) MapReduce 求平均成绩

    china:张三 78李四 89王五 96赵六 67english张三 80李四 82王五    84赵六 86math张三 88李四 99王五 66赵六 77 import java.io.IOEx ...

  9. Junit4学习笔记--方法的执行顺序

    package com.lt.Demo.TestDemo; import java.util.Arrays; import java.util.Collection; import org.junit ...

  10. 通过Delphi获得qq安装路径

    procedure TForm1.Button2Click(Sender: TObject); var Reg:TRegistry; Val:TStrings; ii:System.Integer; ...