文章目录

  • 前言
  • 一、代码
    • 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模型相关推荐

  1. epoll反应堆模型

    ================================ 下面代码实现的思想:epoll反应堆模型:( libevent 网络编程开源库 核心思想) 1. 普通多路IO转接服务器: 红黑树 ― ...

  2. Epoll 反应堆模型核心原理及代码讲解

    Epoll 反应堆模型核心原理及代码讲解 [Ⅰ] Epoll 原理及应用 && ET模式与LT模式 [Ⅱ] Epoll 反应堆模型核心原理及代码讲解 一.反应堆核心原理 二.反应堆模型 ...

  3. Linux网络编程7——epoll反应堆模型

    学习视频链接 16-epoll反应堆main逻辑_bilibili_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1iJ411S7UA?p=81& ...

  4. Linux下select, poll和epoll IO模型的详解

    http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大规模并发网络程序的热 ...

  5. linux epoll事件模型详解

    一.介绍 epoll是Linux(内核版本2.6及以上支持)下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件 ...

  6. Epoll Reactor模型的部分代码[选自gxc]

    之前写过的一个Linux下Select模型也是采取类似的方法,在另外的线程里面使用循环来执行update. 文章 经验实在太重要了:epoll的一些补充 提到几个Epoll的关键问题,这里借鉴作者的说 ...

  7. 350行C代码实现epoll reactor模型

    有了epoll为什么还需要reactor? 响应快,不必为单个同步事件所阻塞,虽然 Reactor 本身依然是同步的: 编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进 程 ...

  8. python epoll多路复用技术_python IO 多路复用 epoll简单模型

    IO多路复用就是我们说的select poll epoll 通过一种机制使一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,epoll()函数就可以返回. ...

  9. epoll反应堆模型代码

    libevent函数库核心思想 /*** epoll_loop.c ***/ #include<stdio.h> #include<sys/epoll.h> #include& ...

  10. linux C 基于事件回调的epoll反应堆模型

    先看一眼事件声明的结构体 #define MAX_EVENTS 1024 //监听上限数 #define BUFLEN 4096 #define SERV_PORT 8080void recvdata ...

最新文章

  1. SAP SD销售业务中客户投诉退货的处理方案
  2. 活动回顾 | 8月7日Apache Flink Meetup
  3. CentOS 7关闭firewalld启用iptables
  4. Apache 查看连接数
  5. 枚举、自动装箱与注解(元数据)
  6. JS逆向---获取某知名外卖平台数据(_token)
  7. c语言实现生成随机数
  8. 气压、温度、湿度传感器BME280的使用方法
  9. allergro音乐术语什么意思_音乐术语
  10. Ubuntu系统搭建PPPoE服务器,Ubuntu上架设PPPoE Server
  11. 笑一笑-道高一尺魔高一丈
  12. SpringCloud+CloudAlibaba微服务初阶入门
  13. OpenGL 渲染正方体
  14. Gartner发布《2021年企业低代码平台魔力象限》低码一体化平台成趋势
  15. WINDOWS10突然无法识别U盘(设备和驱动器中不显示)的解决方法
  16. ECharts之阶梯瀑布柱状图
  17. linux中grep的用法
  18. Java 8 stream学习
  19. 快速有效增加网站外链的技巧
  20. 读书笔记--删除数据时的提示效果在项目中的应用

热门文章

  1. 信号隔离器在供热控制系统中的应用
  2. 青海省计算机职业高中学校,青海的职业技术学校有哪些?
  3. ARM V8A体系结构-第七章 AArch64的浮点和NEON
  4. 西农姚义清组招生物质能源与材料方向博士后/研究助理/研究生
  5. 互联网思维“独孤九剑”
  6. cordova 人脸识别,如何在Cordova项目中集成华为远程配置服务
  7. 搭建Gitlab教程详解
  8. 嵌入式面试常见问题(十一)—各大公司面试题
  9. 三星手机邮箱发送服务器设置,三星手机设置-更多-Coremail论客邮件系统-企业邮箱,10亿用户信赖的邮件服务器系统...
  10. JSLint for Eclipse