epoll---Rector模型
文章目录
- 前言
- 一、代码
- 1.Include
- 2.数据结构
- 3.ACCEPT回调函数
- 3.RECV回调函数
- 4.SEND回调函数
- 5.MAIN函数
前言
- 组成:非阻塞的io模型+io多路复用
- 特征:基于时间循环,以时间驱动或者时间回调的方式来实现业务逻辑
- 表述:将连接的io处理转化为事件处理(由以前的epoll对fd进行管理 改成了对时间管理)
一、代码
1.Include
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <errno.h>#include <stdio.h>
#include <string.h>
#include <stdlib.h>
2.数据结构
struct sockitem{int sockfd;int (*callback)(int fd, int events, void* args);void *args;char recvbuffer[1024];char sendbuffer[1024];
};
struct reactor{int epfd;struct epoll_event events[512];
};
3.ACCEPT回调函数
int accept_cb(int fd, int events, void *arg){struct sockaddr_in client_addr;memset(&client_addr, 0, sizeof(struct sockaddr_in));socklen_t client_len = sizeof(struct sockaddr_in);int clientfd = accept(fd, (struct sockaddr*)&client_addr, &client_len);if(clientfd < 0) return -1;char str[INET_ADDRSTRLEN];printf("recv form ip%s port%d \n",inet_ntop(AF_INET, &client_addr.sin_addr, str, sizeof(str)), ntohs(client_addr.sin_port));struct sockitem *si = (struct sockitem*)malloc(sizeof(struct sockitem));si->sockfd = clientfd;si->callback = rev_cb;struct epoll_event ev;ev.data.ptr = si;ev.events = EPOLLIN;epoll_ctl(eventpool->epfd, EPOLL_CTL_ADD, clientfd, &ev);return 1;
}
3.RECV回调函数
int rev_cb(int fd, int events, void *arg){int clientfd = fd;char buffer[1024];memset(&buffer,0,sizeof(buffer));struct epoll_event ev;struct sockitem* si = (struct sockitem*)arg;int ret = recv(clientfd , buffer,sizeof(buffer),0);if(ret < 0){if(errno == EAGAIN || errno == EWOULDBLOCK){return -1;}else{close(fd);ev.events = EPOLLIN;ev.data.fd = fd;epoll_ctl(eventpool->epfd, EPOLL_CTL_DEL, fd, &ev);free(si);return 0;}}else if (ret == 0){printf("disconnect %d\n", clientfd);//断开了 close wait 收到了finalclose(clientfd);ev.events = EPOLLIN;epoll_ctl(eventpool->epfd, EPOLL_CTL_DEL, fd, &ev);free(si);return 0;}else{printf("Recv: %s, %d Bytes\n", buffer, ret);ev.events = EPOLLOUT;si->callback = send_cb;ev.data.ptr = si;epoll_ctl(eventpool->epfd, EPOLL_CTL_MOD, fd, &ev);} return clientfd;
}
4.SEND回调函数
int send_cb(int fd, int events ,void *arg){char buf[] = "hello-client!";send(fd, buf, sizeof(buf), 0);struct epoll_event ev;struct sockitem* si = (struct sockitem*)arg;ev.events = EPOLLIN;si->callback = rev_cb;ev.data.ptr = si;epoll_ctl(eventpool->epfd, EPOLL_CTL_MOD, fd, &ev);return fd;
}
5.MAIN函数
struct reactor* eventpool = NULL;
int main(int argc, char * argv[]){//./epoll 8080if(argc < 2) return -1;int port = atoi(argv[1]);int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0) return -1;struct sockaddr_in addr;memset(&addr, 0, sizeof(struct sockaddr_in));addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = INADDR_ANY;if(bind(sockfd, (struct sockaddr*)&addr,sizeof(struct sockaddr_in))) return -2;if(listen(sockfd, 5) < 0) return -3;eventpool = (struct reactor*) malloc(sizeof(struct reactor));eventpool->epfd = epoll_create(1);struct epoll_event ev;ev.events = EPOLLIN;struct sockitem *si = (struct sockitem*)malloc(sizeof(struct sockitem));si->sockfd = sockfd;si->callback = accept_cb;ev.data.ptr = (void*)si;epoll_ctl(eventpool->epfd,EPOLL_CTL_ADD, sockfd, &ev);//加入红黑树while(1){//epfd 根节点//events 袋子//1024 快递员一次带回多少 不是最大的连接数 总数量的百分之一int nready = epoll_wait(eventpool->epfd,eventpool->events, 1024, -1);if(nready < -1) break;int i = 0;for(i=0; i< nready; i++){if(eventpool->events[i].events & EPOLLIN){struct sockitem *si = (struct sockitem*)eventpool->events[i].data.ptr;si->callback(si->sockfd, eventpool->events[i].events ,si);}if(eventpool->events[i].events & EPOLLOUT){struct sockitem *si = (struct sockitem*)eventpool->events[i].data.ptr;si->callback(si->sockfd, eventpool->events[i].events ,si);}}}return 0;
}
epoll---Rector模型相关推荐
- epoll反应堆模型
================================ 下面代码实现的思想:epoll反应堆模型:( libevent 网络编程开源库 核心思想) 1. 普通多路IO转接服务器: 红黑树 ― ...
- Epoll 反应堆模型核心原理及代码讲解
Epoll 反应堆模型核心原理及代码讲解 [Ⅰ] Epoll 原理及应用 && ET模式与LT模式 [Ⅱ] Epoll 反应堆模型核心原理及代码讲解 一.反应堆核心原理 二.反应堆模型 ...
- Linux网络编程7——epoll反应堆模型
学习视频链接 16-epoll反应堆main逻辑_bilibili_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1iJ411S7UA?p=81& ...
- Linux下select, poll和epoll IO模型的详解
http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大规模并发网络程序的热 ...
- linux epoll事件模型详解
一.介绍 epoll是Linux(内核版本2.6及以上支持)下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件 ...
- Epoll Reactor模型的部分代码[选自gxc]
之前写过的一个Linux下Select模型也是采取类似的方法,在另外的线程里面使用循环来执行update. 文章 经验实在太重要了:epoll的一些补充 提到几个Epoll的关键问题,这里借鉴作者的说 ...
- 350行C代码实现epoll reactor模型
有了epoll为什么还需要reactor? 响应快,不必为单个同步事件所阻塞,虽然 Reactor 本身依然是同步的: 编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进 程 ...
- python epoll多路复用技术_python IO 多路复用 epoll简单模型
IO多路复用就是我们说的select poll epoll 通过一种机制使一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,epoll()函数就可以返回. ...
- epoll反应堆模型代码
libevent函数库核心思想 /*** epoll_loop.c ***/ #include<stdio.h> #include<sys/epoll.h> #include& ...
- linux C 基于事件回调的epoll反应堆模型
先看一眼事件声明的结构体 #define MAX_EVENTS 1024 //监听上限数 #define BUFLEN 4096 #define SERV_PORT 8080void recvdata ...
最新文章
- SAP SD销售业务中客户投诉退货的处理方案
- 活动回顾 | 8月7日Apache Flink Meetup
- CentOS 7关闭firewalld启用iptables
- Apache 查看连接数
- 枚举、自动装箱与注解(元数据)
- JS逆向---获取某知名外卖平台数据(_token)
- c语言实现生成随机数
- 气压、温度、湿度传感器BME280的使用方法
- allergro音乐术语什么意思_音乐术语
- Ubuntu系统搭建PPPoE服务器,Ubuntu上架设PPPoE Server
- 笑一笑-道高一尺魔高一丈
- SpringCloud+CloudAlibaba微服务初阶入门
- OpenGL 渲染正方体
- Gartner发布《2021年企业低代码平台魔力象限》低码一体化平台成趋势
- WINDOWS10突然无法识别U盘(设备和驱动器中不显示)的解决方法
- ECharts之阶梯瀑布柱状图
- linux中grep的用法
- Java 8 stream学习
- 快速有效增加网站外链的技巧
- 读书笔记--删除数据时的提示效果在项目中的应用
热门文章
- 信号隔离器在供热控制系统中的应用
- 青海省计算机职业高中学校,青海的职业技术学校有哪些?
- ARM V8A体系结构-第七章 AArch64的浮点和NEON
- 西农姚义清组招生物质能源与材料方向博士后/研究助理/研究生
- 互联网思维“独孤九剑”
- cordova 人脸识别,如何在Cordova项目中集成华为远程配置服务
- 搭建Gitlab教程详解
- 嵌入式面试常见问题(十一)—各大公司面试题
- 三星手机邮箱发送服务器设置,三星手机设置-更多-Coremail论客邮件系统-企业邮箱,10亿用户信赖的邮件服务器系统...
- JSLint for Eclipse