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

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

poll()机制和select()机制是相似的,都是对多个描述符进行轮询的方式。

不同的是poll()没有描述符数目的限制。

是通过struct pollfd结构体,对每个描述符进行轮询的

struct pollfd fdarray

{

  int fd;    /*文件描述符*/

  short events; /*表示等待的事件*/

  short revents;/*表示返回事件即实际发生的事件*/

};

data.h

#ifndef DATA_H
#define DATA_H
#include <string.h>
#include <stdio.h>
#include <poll.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <assert.h>
#include <unistd.h>
#define maxn 1100
#define MAXLINE 10
#define LISTEN 10
#define IP "127.0.0.1"
#define PORT 4578
#define BACKLOG 5
#define INFTIM -1
#endif

server.c

  1 #include "data.h"
  2 static void deal_message(struct pollfd *fd_array,int num);
  3 static void poll_accept(int sockfd);
  4
  5 static int init()
  6 {
  7     struct sockaddr_in server_in;
  8     int sockfd;
  9     if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
 10     {
 11         fprintf(stderr,"socket fail,error :%s\n",strerror(errno));
 12         return -1;
 13     }
 14     bzero(&server_in,sizeof(server_in));
 15     server_in.sin_family = AF_INET;
 16     server_in.sin_port = htons(PORT);
 17     inet_pton(AF_INET,IP,&server_in.sin_addr);
 18     if(bind(sockfd,(struct sockaddr*)&server_in,sizeof(struct sockaddr)) == -1)
 19     {
 20         fprintf(stderr,"bind fail,error:%s\n",strerror(errno));
 21         return -1;
 22     }
 23     listen(sockfd,BACKLOG);
 24     return sockfd;
 25 }
 26
 27 static void poll_accept(int sockfd)
 28 {
 29     struct pollfd fd_array[maxn];
 30     int afd;
 31     int pollfd;
 32     struct sockaddr_in client_in;
 33     bzero(&client_in,sizeof(client_in));
 34     int i = 0;
 35     fd_array[0].fd = sockfd;
 36     fd_array[0].events = POLLIN;
 37     for(i=0;i<maxn;i++)
 38     {
 39         fd_array[i].fd = -1;
 40     }
 41     int num = 0;
 42     int len = sizeof(client_in);
 43     while(1)
 44     {
 45
 46         pollfd = poll(fd_array,num+1,INFTIM);
 47         if(pollfd == -1)
 48         {
 49             fprintf(stderr,"poll fail,error %s\n",strerror(errno));
 50             return;
 51         }
 52         if(pollfd == 0)
 53         {
 54             continue;
 55         }
 56         if(fd_array[0].revents & POLLOUT)
 57         {
 58             if((afd = accept(sockfd,(struct sockaddr*)&client_in,&len)) == -1)
 59             {
 60                 fprintf(stderr,"accept fail,error:%s\n",strerror(errno));
 61                 return ;
 62             }
 63         }
 64         i = 0;
 65         for(i =0;i<maxn;i++)
 66         {
 67             if(fd_array[i].fd < 0)
 68             {
 69                 fd_array[i].fd = afd;
 70                 break;
 71             }
 72         }
 73         if(i == maxn)
 74         {
 75             printf("too many to server!\n");
 76             return ;
 77         }
 78         fd_array[i].events = POLLIN;
 79         if(i > num )
 80             num = i;
 81         if(--pollfd <= 0)
 82             continue;
 83     }
 84     deal_message(fd_array,num);
 85 }
 86
 87 static void deal_message(struct pollfd *fd_array,int num)
 88 {
 89     int i,n;
 90     char buf[maxn];
 91     memset(buf,‘\0‘,sizeof(buf));
 92     for(i=1;i<=num;i++)
 93     {
 94         if(fd_array[i].fd < 0)
 95             continue;
 96         if(fd_array[i].revents&POLLIN)
 97         {
 98             n = read(fd_array[i].fd,buf,maxn);
 99             if(n == 0)
100             {
101                 close(fd_array[i].fd);
102                 fd_array[i].fd = -1;
103                 continue;
104             }
105             write(STDOUT_FILENO,buf,n);
106             write(fd_array[i].fd,buf,n);
107         }
108     }
109 }
110 int main()
111 {
112     int sockfd = init();
113     poll_accept(sockfd);
114     close(sockfd);
115     return 0;
116 }
时间: 2024-10-24 20:08:40

多路复用I/O模型poll() 模型 代码实现的相关文章

32网络通信之Poll模型

多路复用并发模型  -- poll #include<poll.h> int  poll(struct pollfd *fds,  unsigned int nfds, int timeout); struct pollfd { int       fd;                //轮询的文件描述符 short  events;         //等待的事件 short  revents;        //实际发生的事件 } nfds      :     fds 数组大小 tim

(转)EF中数据优先,模型优先和代码优先

看了很多文章也不是很明白,说的都太书面化了,大家看看这图一下子就明白了,哈哈 其实看图很简单,database first和model first都是通过 data model创建的edmx文件,只不过model first模块可以自己根据需要创建和修改实体,显得更加灵活. codefist是一个class代码文件,它可以由一些第三方的软件可视化的创建,也是非常灵活的一种方式,目前被使用也是最广泛的. 二.Entity Framework Database first(数据库优先)使用过程 2.

raycaster选取捕获obj模型&amp;&amp;选中高亮代码

目录 raycaster选取捕获obj模型&&选中高亮代码 raycaster关键代码 选中高亮代码 obj整体上色 raycaster选取捕获obj模型&&选中高亮代码 raycaster关键代码 raycaster默认状态下是无法读取obj模型, 因为模型是自动加载到一个组里的, 因此需要调用intersectObject方法 //原来的代码 //raycaster.setFromCamera(mouse, camera); //第二个参数一定要为ture,这样才能捕获

01_有监督学习--简单线性回归模型(最小二乘法代码实现)

有监督学习--简单线性回归模型(最小二乘法代码实现)0.引入依赖1.导入数据(data.csv)2.定义损失函数3.定义模型拟合函数4.测试:运行最小二乘算法,计算 w 和 b5.画出拟合曲线6.附录-测试数据 有监督学习--简单线性回归模型(最小二乘法代码实现) 0.引入依赖 import numpy as npimport matplotlib.pyplot as plt 1.导入数据(data.csv) points = np.genfromtxt('data.csv', delimite

汇总css布局模型和常见代码缩写与长度单位

知识点一:css布局模型:布局模型是建立在盒模型基础之上,在网页中,元素有三种布局模型:1.流动模型(Flow)2.浮动模型 (Float)3.层模型(Layer). 一.流动模型:默认的网页布局模式.也就是说网页在默认状态下的 HTML 网页元素都是根据流动模型来分布网页内容的‘:特征1.块状元素都会在所处的包含元素内自上而下按顺序垂直延伸分布,原因?默认状态下,块状元素的宽度都为100%,导致块状元素都会以行的形式占据位置.特征2.内联元素都会在所处的包含元素内从左到右水平分布显示. 二.浮

iOS 自定义对象及子类及模型套模型的拷贝、归档存储的通用代码

一.runtime实现通用copy 如果自定义类的子类,模型套模型你真的会copy吗,小心有坑. copy需要自定义类继承NSCopying协议 #import <objc/runtime.h> - (id)copyWithZone:(NSZone *)zone { id obj = [[[self class] allocWithZone:zone] init]; Class class = [self class]; while (class != [NSObject class]) {

Linux的I/O多路复用机制之--select&poll

1. Linux下的五种I/O模型 1)阻塞I/O(blocking I/O)2)非阻塞I/O (nonblocking I/O)3) I/O复用(select 和poll) (I/O multiplexing)4)信号驱动I/O (signal driven I/O (SIGIO))5)异步I/O (asynchronous I/O (the POSIX aio_functions)) (前四种都是同步,只有最后一种才是异步IO.) 五种I/O模型的比较: 2.多路复用--select 系统提

KVC简单介绍 -字典转模型,模型转字典

// 以下两个方法,都属于 KVC 的方法 // KVC 是 cocoa 的大招!间接给对象属性设置数值 // 程序执行过程中,动态给对象属性设置数值,不关心 .h 中是如何定义的 //      只要对象有属性(无论是在.h中还是在.m中定义的属性),就能够读取/设置! //      这种方式,有点违背程序的开发原则! // 字典转模型 setValuesForKeysWithDictionary // 模型转字典 dictionaryWithValuesForKeys //假设self.p

行为型模型 解释模型

行为型模型 解释模型 /** * 行为型模型 解释模型 * 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子. * */ #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> class Context { public: Context(int num) { m_num = num; } void setNum(int num) { m_num = num