首页 > 其他分享 >事件处理模式

事件处理模式

时间:2024-07-22 23:51:17浏览次数:14  
标签:事件处理 addr int list 模式 fd connfd event

事件处理模式

reactor模式

reactor是一种事件处理模式,出现要解决的问题是要将原本IO管理转变为更关心事件管理,每个事件发生的时候调用回调函数进行处理。

构成

  1. register 注册事件
  2. callback 回调函数
  3. 包括io, event, callback, rbuffer, wbuffer
  4. 需要注意的是event和call_back对应,IO与参数对应

结构

结构的定义要处理两个关系,第一个是一个事件对应一个回调函数,第二个是

typedef int (*cb_func)(int);
typedef cb_func CALL_BACK;
strcut connfd{
    int fd;
    char rbuffer[1024];
    char wbuffer[1024];
    int rlength;
    int wlength;
    CALL_BACK send_back;
    union{
        CALL_BACK accept_back;
        CALL_BACK recv_back;
    }recv_accept;
}
struct connfd connfd_list[MAX_CONNFD] = {0};

实现

int accept_cb(int fd){
    struct sockaddr_in client;
    memset(&client , 0, sizeof(client))
    socklen_t len = sizeof(client);
    int clientfd = accept(fd, (struct sockaddr*)&client, &len);
    connfd_list[clientfd] = clientfd;
    connfd_list[clientfd].recv_accept.recv_back = recv_cb;
    connfd_list[clientfd].send_back = recv_cb;
    set_event(clientfd, EPOLLIN, 1);
    return 0;
}
int recv_cb(int fd){
    connfd_list[fd].rbuffer = {0};
    
    int n =recv(fd, connfd_list[fd].rbuffer, MAX_BUFFER_SIZE, 0);
    if(n == 0){
        epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL);
    }
    connfd_list[fd].rlength = n;
    connfd_list[fd].wlength = connfd_list[fd].rlength;
    memcpy(connfd_list[fd].wbuffer,connfd_list[fd].rbuffer,connfd_list[fd].wlength);
    set_event(fd, EPOLLOUT, 0);
    return 0;
}
int send_cb(int fd){
    send(fd, connfd_list[fd].wbuffer, connfd_list[fd].wlength, 0);
    set_event(fd, EPOLLIN, 0);
    return 0;
}
// 注册事件
int set_event(int fd, int event, int op)
    struct epoll_event ev;
    ev.data.fd = fd;
    ev.events = event;
	if(op){
        epoll_ctl(epollfd, EPOLL_CTL_ADD, fd,&ev);
        return 0;
    }else{
        epoll_ctl(epollfd, EPOLL_CTL_MOD, fd,&ev);
    }
	return 0;
}
int init(port, ip){
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in server_addr;
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sinport = htons(port);
    server_addr.sin_addr.s_addr = inet_addr(ip);
    int ret = bind(sockfd, (stucrt asockaddr*)server_addr. sizeof(server_addr));
    listen(sockfd, 5); // 最多挂起五个连接
    return sockfd;
}
int main(){
    int epollfd = epoll_create(1);
    int listenfd = init(port, ip);
    connfd_list[listenfd].fd = listenfd;
    connfd_list[listenfd].recv_accept.accept_back = accept_cb;
    // 注册
    set_event(listenfd, EPOLLIN, 1);
    
    while(1){ // mainloop
        int nready =  epoll_wait();
        for(int i = 0; i < nready; ++i){
            // 这部分就是读取的过程
        }
    }
}
// 

注意

  1. 读写分离

  2. IO与事件分离

  3. 百万并发连接可能会发生TCP五元组不够的情况1024-65536,这种情况是因为服务器IP端口不够,所以修改服务器IP端口修改即可

  4. 系统版本不一致也会影响,这是因为/etc/sysctl.conf下的设置问题,老版本file-max也应该修改

  5. 为什么百万连接之后,客户端,突然关闭服务器也会关闭,这是因为突然有大量连接关闭,CPU需要处理资源处理,解决方法是使用SignalHanler。而且可能因为内存占用多,而终结客户端。

  6. 这个问题是时间值设定出现了问题,未进行初始化引发了冲突定义问题。

    image-20240722200036324

标签:事件处理,addr,int,list,模式,fd,connfd,event
From: https://www.cnblogs.com/solicit/p/18317295

相关文章

  • WCH-LinkW无线下载仿真调试器&无线串口通信(主/从机模式)-RISC-V/ARM内核MCU无线DAP下
    LinkW-1V1 主机 硬创社搜索(WCH-LinkW):WCH-LinkW无线下载仿真调试器-硬创社 板载PCB天线:2.4G板载天线AD库资源-CSDN文库简介: WCH-LinkW无线下载仿真调试器&无线串口通信(主/从机模式)。应用场景: 1、用于RISC-V/ARM内核MCU无线DAP下载仿真调试器2、......
  • 生产者消费者设计模式
    生产者消费者设计模式学习一、什么是生产者消费者设计模式Java中的生产者-消费者设计模式是一种用于多线程编程的经典设计模式,它用于解决多个线程之间共享资源时的同步和通信问题。这个模式主要用在有数据生产者(Producer)和数据消费者(Consumer)的场景中,生产者负责产生数据,而消费者......
  • 职责链、命令和观察者设计模式的区别
    职责链、命令和观察者是三种不同的设计模式,它们各自解决不同类型的问题。下面分别介绍这三种设计模式的特点和区别:1.职责链模式(ChainofResponsibility)定义:职责链模式是一种行为设计模式,它通过将请求的处理者组织成一个链,使得请求可以沿这条链传递,直到有一个处理者处理......
  • (笔记)深入解读EtherCAT时钟DC同步的三种模式
     一、DC同步原理     用EtherCAT的分布式时钟(DC)功能使从站设备同步指的是,总线中的第一个DC从站被定义为基准时钟,EtherCAT主站将基准时钟的时间分配至所有的从站。因此,EtherCAT主站周期性发送一个ARMW命令,以此读取存储在时钟主站的ESC(EtherCAT从站控制器)上适当的寄存......
  • 【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)
    【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)大家好我是寸铁......
  • 如果不重新启动 django,上传的媒体不会在生产模式下运行
    我需要在生产模式下在Django中提供媒体服务,并且很少需要在Django管理中提供电报用户照片。所以我知道关于Django的一切,它不是为了提供文件或媒体,所以没有必要重复重复的事情。我只需要在生产模式下为我的目的提供媒体服务,因此我使用WhiteNoise来执行此操作并附加以下行:......
  • 一文看懂免单优选模式
    在日新月异的电商领域,一种名为“免单优选”的创新销售模式正悄然兴起,它以独特的魅力吸引着广大消费者的目光。这种模式的核心理念简单而直接:通过免单奖励激发购买热情,让购物不再是单纯的消费,而是一场充满惊喜与回馈的旅程。特点概览合法合规:免单优选模式严格遵守国家法律法规......
  • 干货 | 2024基于风险驱动的交付模式转型探索与实践(免费下载)
    以上是资料简介和目录,如需下载,请前往星球获取:......
  • 设计模式之观察者模式(学习笔记)
    定义观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。这种模式用于实现对象之间的解耦,使得一个对象的变化可以通知并更新多个依赖对象,而无需直接引用它们。为什么使用观察者模式?解耦观......
  • lua开发:有限状态机模式设计
    有限状态机,表示有限个状态以及在这些状态之间的转移和动作等行为的处理模型。在任意时刻有限状态机都处于某一特定的状态,并且可以根据当前状态和输入条件(触发事件),从当前状态转移到另一个状态。核心概念:实体(Entity):状态机的主体和作用对象,它的状态可以改变状态(State):实体在某......