基于一个echo服务器来解读epoll反应堆模型

总览

在本篇文章,你学会写一个基于echo服务器, 并且可以可以测试.
请你把代码从我给的位置下载下来,并且自己改写和测试,这样会对你更有帮助.

这个代码应该很经典了,出处不祥。

预备知识

  • c语言基础
  • c语言网络编程知识 套接字编程,select, poll, epoll的基本知识

语法速查

  • __func__: 一个宏,指代当前函数名
  • c语言函数默认参数
  • epoll_event数据结构
    struct epoll_event {
        __uint32_t events; /* Epoll events */
        epoll_data_t data; /* User data variable */
    };
    typedef union epoll_data {
        void *ptr;
        int fd;
        uint32_t u32;
        uint64_t u64;
    } epoll_data_t;
    
    EPOLLIN :	表示对应的文件描述符可以读(包括对端SOCKET正常关闭)
    EPOLLOUT:	表示对应的文件描述符可以写
    EPOLLPRI:	表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来)
    EPOLLERR:	表示对应的文件描述符发生错误
    EPOLLHUP:	表示对应的文件描述符被挂断;
    EPOLLET: 	将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)而言的
    EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里
    

实践要求

linux 系统, 因为macos不支持 epoll

代码预览

/*
 *epoll基于非阻塞I/O事件驱动
 */
#include <stdio.h>
#include <sys/socket.h>
#include <sys/epoll.h> // MacOS系统没有该库函数,仅限Linux独家
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define MAX_EVENTS  1024                                    //监听上限数
#define BUFLEN 4096
#define SERV_PORT   8080

void recvdata(int fd, int events, void *arg);
上一篇:IO多路复用技术详解


下一篇:WebSocket协议 与 IO多路复用